一、程序计数器
可以看成当前线程执行的字节码的行号指示器。
如果当前线程正在执行Java方法,指向的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法,其值为空。
此内存区域不存在OutOfMemoryError异常。
二、Java虚拟机栈
当前线程特有,周期与线程一致。
虚拟机栈是Java方法执行的内存模型,每个方法执行的同时会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。方法执行对应着栈帧从虚拟机栈入栈到出栈的过程。
三、本地方法栈
本地方法栈是为虚拟机使用到的本地方法(Native方法)服务的。
以上都是线程隔离的数据区
四、Java堆
被所有线程共享,存放对象实例。
五、方法区
被所有线程共享,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。又称为”非堆”。
六、运行时常量池
运行时常量池是方法区的一部分。
常量池用于存放编译生成各种字面量和符合引用。在类加载后进入到运行时常量池中存放。
七、直接内存
虚拟机之外的内存,在NIO中,频繁使用的内存,使用DirectByteBuffer对象直接引用,减少Java对和直接内存之间的复制数据。
以上运行时数据区域使用下图来示意: