Java虚拟机运行时的五大区域

JAVA虚拟机运行时的五大区域

Java虚拟机运行时的五大区域

1.程序计数器

(1)较小的内存空间,执行程序时的行号指示器,依靠它来选择下一条需要执行的指令。

(2)线程私有的区域。

(3)线程执行java方法,计数器记录的是正在执行的虚拟机字节码指令的地址。

(4)唯一一个没有outofmemoryerror的内存区域。

2.虚拟机栈

(1)线程私有的区域,生命周期与线程相同。

(2)描述的是java方法执行的内存模型。

(3)每个java方法执行的同时,都会创建一个栈帧,用来存储局部变量表等。

(4)每个java方法从调用到执行完成的过程,就对应栈帧在虚拟机栈中入栈到出栈的过程。

(5)线程请求的栈深度大于所允许的深度,抛出*error异常。

(6)如果虚拟机栈可以动态扩展,扩展无法请求到足够的空间,抛出*error异常。

3.本地方法栈

与java虚拟机栈的作用是几乎相同的,只不过虚拟机栈为java方法服务,本地方法栈为native方法服务。native方法是与C++联合开发时采用用的,java自己开发不用native方法。

4.堆

(1)被所有线程所共享。

(2)唯一的目的就是存放对象实例。

(3)垃圾收集(Garbage collected)的主要区域。

(4)如果堆中没有内存完成实例分配,并且堆无法扩展时,会抛出outofmemoryerror异常。

5.方法区

(1)被所有线程所共享。(2)存储已经被虚拟机加载的类信息,常量和静态变量。(3)可以不实现垃圾收集,效果不好,但有些时候也要收集,也可能出现一些问题。(4)当方法区无法满足内存分配需求的时候,就会抛出outofmemoryerror异常。