JVM Runtime Data Area 运行时数据区

JVM Runtime Data Area 运行时数据区

上图,这个可以算是JVM的灵魂,Java运行时数据区。

Java运行时数据区包含:程序计数器 Program Counter Register,方法区 Method Area,堆 Heap,虚拟机栈 VM Stack,本地方法栈 Native Method Stack

堆Heap:

属于虚拟机中所管理的内存最大的一块,是被所有线程共享的一块内存区域。这个区域的唯一目的就是存放对象实例。可以认为所有的对象实例都是在堆的内存空间进行内存的分配。

既然是给对象实例分配内存,那么GC就会管理这个区域。GC本身包含了很多种类,各种新生代,老年代,永久代,Eden,Survivor。

堆可以实现成固定大小,也可以是可扩展的。HotSpot可以通过 -Xmx -Xms设定。

栈 Stack

虚拟机栈 VM Stack:

属于线程私有,描述的是Java方法执行的线程内存模型:和线程有关,每个方法被执行的时候,JVM都会同步创建一个栈帧Stack Frame,存储局部变量表,操作数栈,动态连接,方法出口等。每一个方法被调用直至执行完毕的过程,就对应一个栈帧在虚拟机中从入栈到出栈的过程。

本地方法栈 Native Method Stacks

执行的是VM使用的本地方法服务。HotSpot直接将本地方法栈和虚拟机栈合并。

方法区 Method Area

属于线程共享区域,存储已经被虚拟机加载的类型信息,常量,静态变量,JIT编译后的代码缓存等。

JDK8之前,HotSpot设计者使用永久代实现了方法区,在JDK8以后,就放弃了永久代,把JDK7中永久代中的类型信息全部移到元空间中。

程序计数器Program Counter Register

占较小的内存空间,看成是当前线程所执行的字节码的行号指示器,是唯一个没有规定任何OutOfMemoryError的区域

 

原文地址:https://www.cnblogs.com/dreamtaker/p/13293347.html