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异常。