JVM 的内存模型以及分区情况和作用
如下图所示:
JVM 内存结构
方法区 栈 本地方法栈
堆 程序计数器
线程共有 线程私有
黄色部分为线程共有,蓝色部分为线程私有。
方法区
用于存储虚拟机加载的类信息,常量,静态变量等数据。
堆
存放对象实例,所有的对象和数组都要在堆上分配。是 JVM 所管理的内存中最大的一块区域。
栈
Java 方法执行的内存模型:存储局部变量表,操作数栈,动态链接,方法出口等信息。生命周期与
线程相同。
本地方法栈
作用与虚拟机栈类似,不同点本地方法栈为 native 方法执行服务,虚拟机栈为虚拟机执行的 Java
方法服务。
程序计数器
当前线程所执行的行号指示器。是 JVM 内存区域最小的一块区域。执行字节码工作时就是利用程序
计数器来选取下一条需要执行的字节码指令。
Java 内存分配
寄存器:我们无法控制。
静态域:static 定义的静态成员。
常量池:编译时被确定并保存在. class 文件中的(final)常量值和一些文本修饰的符号引用(类和接口
的全限定名,字段的名称和描述符,方法和名称和描述符)。非 RAM 存储:硬盘等永久存储空间。
堆内存:new 创建的对象和数组,由 Java 虚拟机自动垃圾回收器管理,存取速度慢。