《Java虚拟机规范(Java SE 7版)》作者:Tim Lindholm、Frank Yellin、Gilad Bracha、Alex Buckley 摘要:第二章 Java虚拟机结构(第2部分)
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种被广泛使用的虚拟机实现。
2.5 运行时数据区
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。
2.5.1 PC寄存器
每一条Java虚拟机线程都有自己的PC(Program Counter)寄存器。
PC寄存器的容量至少应当能保存一个returnAddress类型的数据或者一个与平台相关的本地指针的值。
- 如果有个非native方法正被线程执行,寄存器就保存Java虚拟机正在执行的字节码指令的地址。
- 如果该方法是native的,那PC寄存器的值是undefined
2.5.2 Java虚拟机栈
每一条Java虚拟机线程都有自己私有的Java虚拟机栈(Java Virtual Machine Stack
),这个栈与线程同时创建,用于存储栈帧。
Java虚拟机栈的作用:用于存储局部变量与一些过程结果的地方。另外,它在方法调用和返回中也扮演了很重要的角色。
因为除了栈帧的出栈和入栈之外,Java虚拟机栈不会再受其他因素的影响,所以栈帧可以在堆中分配
Java虚拟机栈所使用的内存不需要保证是连续的。
2.5.3 Java堆
在Java虚拟机中,堆(Heap
)是可供各条线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。
Java堆在虚拟机启动的时候就被创建,它存储了被自动内存管理系统(垃圾收集器
)所管理的各种对象,这些受管理的对象无需,也无法显式地被销毁。
2.5.4 方法区
方法区(Method Area)是可供各条线程共享的运行时内存区域
方法区,存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法
方法区在虚拟机启动的时候被创建,虽然方法区是堆的逻辑组成
部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集。
2.5.5 运行时常量池
运行时常量池:每一个类或接口的常量池的运行时表示形式,包括从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。
每一个运行时常量池都分配在Java虚拟机的方法区
之中,在类和接口被加载到虚拟机后,对应的运行时常量池就被创建出来。
2.5.6 本地方法栈
Java虚拟机实现可能会使用到传统的栈来支持native方法的执行,这个栈就是本地方法栈(Native Method Stack)。
如果支持本地方法栈,那这个栈一般会在线程创建的时候按线程分配。