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的区域