01-运行时数据区分类
JVM 中定义了多个运行时数据区,根据它们创建、销毁的时机,可分为两类:
- per-VM,JVM启动时创建,退出时销毁。通常由 JVM 中所有的线程共享。
- 堆
- 方法区
- 运行时常量池
- per-thread,线程创建时创建,退出时销毁。通常由线程独享。
- pc 寄存器
- 栈 / 本地方法栈
01.1-方法区
JVM 中的方法区可以类比于操作系统中的”text”段区。它用来存储 per-class 结构,例如运行时常量池、域和方法数据、方法和构造器代码等。
逻辑上,方法区是堆空间的一部分。
01.2-运行时常量池
每个类或接口的 .class 文件中都有一个 constant_pool 表,运行时常量池就是这个表的运行时表示。
注:这也意味着方法区中存在多个运行时常量池。
运行时常量池中的条目(Entry)分为两类:
- symbolic references,后续需要继续解析。
- static constants,后续无需再处理。
01.3-栈 / 本地方法栈
在 HotSpot JVM 实现中,两者是合并在一起的。
栈中存储的是一种称为栈帧(frame)的数据结构。栈帧在方法调用是创建,在方法调用完成(正常返回或异常中断)时销毁。