JVM内存布局

Run-Time Data Areas(JVM)运行时数据(内存)区域(布局)包含了六个部分;

1)The pc Register(生命周期与Thread相同)pc寄存器又称程序计数器,用来存储各个线程当前要执行的指令集的地址。

2)Java Virtual Machine Stacks(生命周期与Thread相同):Java虚拟机栈,栈中存的是Frame帧,帧中存储的是局部变量和部分返回结果。可以想象到线程中每次有方法调用时,会创建Frame帧,方法调用结束时Frame帧销毁。

Ps:这里需要注意几个与Java虚拟机栈相关联的异常信息:1>如果一个线程预估需要一个比它所允许的更大的Java虚拟机栈,Java虚拟机栈将会抛出StackOverflowError;2>如果其可以动态扩容,并且企图扩展但是内存空间不够可能会影响扩展,或者如果为一个线程初始化Java虚拟机栈的时候内存空间不足,会导致抛出OutOfMemoryError;

3)Heap(生命周期同Java虚拟机):多个Java虚拟机之间共享heap堆数据空间;堆是运行时数据区域,是分配类的实例和数组的内存空间。heap创建于虚拟机启动的时候。heap堆对于对象的存储是通过自动存储管理系统自动回收的(称为垃圾收集器)。

Ps:下面是与heap堆相关的异常情况,如果一个计算需要更多的heap,超出自动存储管理系统,会抛出OutOfMemoryError;

4)Method Area(生命周期同Java虚拟机):方法区存储每个类的结构,例如运行时常量池,字段属性和方法数据,以及方法和构造函数的代码,包括使用在类中的实例初始化和接口初始化的特殊的方法。

Ps:请注意以下是与方法区相关的异常信息:如果方法区域内存不能满足分配请求,Java虚拟机就会抛出OutOfMemoryError;

5)Run-Time Constant Pool(生命周期同Java虚拟机):运行时常量池中包含了编译时已知的基本数值,以及必须在运行时解析的方法和字段的引用。

Ps:这里需要注意,在Java虚拟机的方法中,当创建一个类或者接口的时候如果运行时常量池的构造需要更多的内存,那么Java虚拟机就会抛出OutOfMemoryError;

6)Native Method Stacks(生命周期与Thread相同):本地方法栈,即调用操作系统原生方法时,所占用的内存空间。

Ps;以下是与本地方法栈相关的异常信息;1>如果线程中的计算需要一个更大的本地方法栈是被允许的,那么Java虚拟机会抛出StackOverflowError;2>如果本地方法栈可以动态扩展并且本地方法栈的试图扩展,但是用于新线程创建初始化本地方法栈内存空间并不足够,Java虚拟机会抛出OutOfMemoryError;

原文地址:https://www.cnblogs.com/LearnSB/p/13649591.html