jvm运行时数据区

内容来自:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1

pc Register
java虚拟机支持多线程。每个线程有自己的 pc Register (程序计数器)。在任何时刻,每个线程在执行一个方法的代码,称为该线程的当前方法。如果该方法不是native,pc register 包含虚拟机指令的地址。如果是native方法,则 pc register 中的值是undefined。pc register 的大小可以装下返回地址和指定平台的 native pointer。

Java Virtual Machine Stacks
每个jvm线程有个私有的jvm栈,在线程创建时创建。jvm栈存储栈帧,jvm栈类似于C语言中的栈:它存储局部变量和部分结果,参与实现方法调用和返回。除了push和pop栈帧,通常不会直接操作jvm栈,栈帧可能是堆分配的。jvm栈的内存不必连续。
本规范允许jvm栈是固定大小或根据计算需要动态扩展。如果jvm栈是固定大小的,在创建线程的时候,每个jvm栈的大小可能要单独设置。

heap
jvm的堆是所有线程共享的。堆是运行时数据区,为所有类实例和数组分配内存。jvm启动时创建堆,对象的堆存储由gc管理,对象不能显式地释放内存。堆的大小可以自由调整。

Method Area
方法取由所有线程共享。方法区存储变异后的代码,与操作系统进程的text段类似。它存储每个类的结构:运行时常量池,字段,方法数据,以及方法和构造函数的代码,包括类中的特殊方法和实例初始化和接口初始化。
方法区在jvm启动时创建。尽管方法区逻辑上属于堆,简单的实现可以选择不进行垃圾回收和压缩。该版本的规范不指定方法区的位置和管理已编译代码的策略。

Run-Time Constant Pool
运行时常量池是class文件中constant_pool表的运行时表现。它包含几种常量,从编译时已知的数值字面量到必须在运行时解析的方法和字段引用。运行时常量池的功能和符号表的功能相似。
运行时常量池在方法区中分配。在jvm创建类和接口时,为类和接口创建运行时常量池。

Native Method Stacks
jvm的实现也许会使用传统的c语言栈,以支持native方法。native方法栈,也许会被jvm指令解释器使用。那些不能加载native方法,和自身不依赖传统栈的jvm实现,不需要提供native方法栈。如果提供了,本地方法栈在线程创建时分配。

附上Hotspot的堆结构图(源自网上):

原文地址:https://www.cnblogs.com/allenwas3/p/8523115.html