Java 存储结构-JVM规范学习笔记
Java线程
- 每个Java虚拟机线程具有一个私有的,与线程同时创建的Java栈,同时每个线程还拥有一个属于自己的PC寄存器。
- Java栈中存储Java虚拟机框架,Java虚拟机框架可以是堆分配的。
- Java栈的存储器不需要连续的,Java虚拟机规范允许Java栈大小是固定的或动态变化的。
- 以下情况将抛出异常:如果线程中计算需要比所允许大的Java栈,将抛出StackOverflowError;如果栈是可动态分配的,当视图扩展Java栈但没有足够的存储器来实现时,将抛出OutOfMemoryError。
- 如果正在执行的方法不是native,那么PC寄存器包含当前正在被执行的的Java虚拟机指令的地址;如果当前执行的方法是native,则PC寄存器的值没有定义。
- PC寄存器占一个字宽。
Java虚拟机框架
- 每次Java方法被调用时创建一个新Java虚拟机框架框架。当框架的方法结束时,框架被撤销。
- 每个框架包含局部变量集、操作数栈和动态链接等。这些结构的存储器空间可以同时分配,因为局部变量集合操作数栈在编译期已知,且框架数据结构的大小只依赖Java虚拟机的实现。
- 在一个给定线程的任何点,只有一个框架,即正在执行的方法的框架是活跃的,也称为当前框架,其方法也称为当前方法。
Java堆
- Java虚拟机所有线程共享同一个堆,从堆中分配所有类的实例和数组。
- Java堆在虚拟机启动的时候创建,对象的堆存储器空间由垃圾回收器进行回收。
- 堆的大小可以是固定的,也可以根据计算的需求进行扩展。
- 当计算要求比存储器可获得的更多的存储器空间时,将抛出OutOfMemoryError。
- Java堆存储器并不要求连续。
方法区
- 所有线程共享同一个方法区,方法区在逻辑上是Java堆的一部分,不需要连续。
- 方法区存储常数池、域和方法数据、以及方法和构造函数。
- 作为堆的一部分,方法区可以实现为不需要进行垃圾回收。
- 如果不能得到方法区中的存储器来满足分配需求,则抛出OutOfMemoryError。
- 方法区可以是固定大小,也可以根据需求进行扩展。
常数池
- 常数池是每个类或接口的Java class文件中的constant_pool的运行期表示。
- 每个常数池从方法区分配。
自身方法栈
- Java虚拟机实现的传统的栈,以支持native方法。