Java虚拟机运行时数据区
1 程序计数器(Program Counter Register)
1.1 程序计数器是一块较小的线程私有的内存空间,可以看作是当前线程锁执行的字节码的行号指示器。
1.2 如果线程正在执行的是一个Java方法,记录的是正在执行的虚拟机字节码指令的地址
1.3 如果执行的是Native方法,计数器值为空(Undefined)
1.4 程序计数器是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
2 Java虚拟机栈
2.1 线程私有的生命周期和线程相同的内存区域。
2.2 虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息
2.3 每一个方法从调用直至执行完成的过程,都对应着一个栈帧在虚拟机栈中入栈到出栈的过程
2.4 long和double类型的数据会占用2个局部变量空间(Slot)
2.5 局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小
2.6 栈中存放的是基本数据类型和堆中对象的引用(4byte)
3 本地方法栈
同上,区别就是执行的是本地方法
4 Java堆
Java堆是被所有线程共享的一块内存区域也是Java虚拟机锁管理的内存中最大的一块
Java堆中存放的是对象
5 方法区
和堆一样是各个线程共享的内存区域
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
6 运行时常量池(Runtime Constant Pool)
是方法区的一部分。
存放编译器生成的各种字面量和符号引用
7 直接内存(Direct Memory)
直接内存并不是虚拟机运行时数据区的一部分,使用Native函数库直接分配堆外内存
使用DirectByteBuffer对象作为这块内存的引用进行操作