文章目录
JVM虚拟内存组成
JVM虚拟内存由五个部分组成,分别是程序计数器,本地方法栈,方法区,Java栈,Java堆。
1. 程序计数器——Program Counter Register
程序计数器是一块较小的内存空间,它的作用可以看做当前线程所执行的字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器完成。程序计数器是线程私有的,如果正在执行的是一个Java方法,则这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是本地方法,这个计数器值则为空。此内存区域是唯一一个在Java虚拟机规范中没有规定任何Out Of Memory Error的区域。
2. 本地方法栈——Native Method Stack
本地方法栈为虚拟机使用到的本地方法服务,本地方法栈存放的方法调用本地接口,最终调用本地方法库,达到与操作系统、硬件交互的目的。而虚拟机栈为执行Java方法(也就是字节码)服务。
3. 方法区——Method Area
方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它有一个别名叫NonHeap,目的应该是与Java堆区分开。
4. Java堆——Java Heap
Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,对于大多数应用来说,Java堆是Java虚拟机所管理的内存中最大的一块。此内存区域创建的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为GC堆(Garbage Collected Heap)。根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
5. Java栈——Java Stack
Java栈是线程私有的,生命周期与线程相同。Java栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。