【JVM系列】1、Run-Time Data Areas 运行时数据区

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。

1、The pc(program counter) Register - 程序计数器 

Java虚拟机可以同时支持许多执行线程,每个Java虚拟机线程都有自己的程序计数器寄存器。

在任何一个确定时刻,一个处理器内核都会执行一条线程中的指令,如果执行的不是native方法,计数器记录的是正在执行的虚拟机指令的地址;如果执行的是native方法,记录的值为空undefined;

2、Java Virtual Machine Stacks - Java虚拟机栈

线程私有,与线程同时创建;

每个方法执行时会创建一个栈帧-frame,用于存储Local Variables-局部变量表、Operand Stacks-操作数栈、Dynamic Linking-动态链接、Normal Method Invocation Completion-方法出口等信息;

异常出现的场景:

2.1如果线程中的计算需要比允许的更大的Java虚拟机堆栈,则Java虚拟机会抛出一个StackOverflowError;

2.2如果可以动态扩展Java虚拟机堆栈,并且尝试进行扩展但可以使内存不足以实现扩展,或者可以使内存不足以为新线程创建初始Java虚拟机堆栈,则Java Virtual机器抛出一个OutOfMemoryError

3、Heap - 堆

堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,用于存储所有类实例和数组;

异常出现的场景:

3.1如果计算需要的堆量超过自动存储管理系统可用的堆,则Java虚拟机会抛出一个 OutOfMemoryError

4、Method Area - 方法区

线程共享内存区域,用于存储存储每类结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的特殊方法;

异常出现的场景:

4.1如果方法区域中的内存无法满足分配请求,则Java虚拟机会抛出一个OutOfMemoryError

5、Run-Time Constant Pool - 运行时常量池

每个运行时常量池都是从Java虚拟机的方法区中分配的。它包含几种常量,从编译时已知的数字文字到必须在运行时解析的方法和字段引用。

异常出现的场景:

5.1在创建类或接口时,如果运行时常量池的构造需要的内存比Java虚拟机的方法区域中可用的内存多,则Java虚拟机会抛出一个OutOfMemoryError

6、Native Method Stacks - 本地方法栈

线程私有;

与虚拟机栈区别:

虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机执行native方法服务;

异常出现的场景:

6.1如果线程中的计算需要比允许的更大的本机方法堆栈,则Java虚拟机会抛出一个StackOverflowError

6.2如果可以动态扩展本机方法堆栈并尝试进行本机方法堆栈扩展,但可以使内存不足,或者如果没有足够的内存可用于为新线程创建初始本机方法堆栈,则Java虚拟机会抛出OutOfMemoryError

官方文档链接:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5

你可能感兴趣的:(Java,JVM)