计算机结构简图
JVM内存模型
详细说明:https://blog.csdn.net/m0_71777195/article/details/126247090
什么是JVM?
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一个虚构出来的计算机,有着自己完善的硬件架构,如处理器、堆栈等。
为什么需要JVM?
Java文件必须先通过一个叫javac的编译器,将代码编译成class文件,然后通过JVM把class文件解释成各个平台可以识别的机器码,最终实现跨平台运行代码。
JVM内存模型
堆和方法区(Metaspace元数据区)是所有线程共有的,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。
1、生命周期与 Thread 相同的区域,即:线程创建时,相应的区域分配内存,线程销毁时,释放相应内存。
- PC Register程序计数器:记录正在执行的JVM字节码指令的地址
- JVM Stack:每个线程一个虚拟机栈,线程内每个方法创建一个栈帧。记录局部变量、方法返回地址等
- 本地方法栈:OS原生的本地方法所需的内存空间
- PC Register:程序计数器, 记录每个线程当前执行的指令信。eg:当前执行到哪一条指令,下一条该取哪条指令。每条线程都会有一个独立的程序计数器。当线程正在执行一个Java方法,程序计数器记录的是正在执行的JVM字节码指令的地址;如果正在执行的是一个Natvie(本地方法),那么这个计数器的值则为空(Underfined)。
- JVM Stack:虚拟机栈,每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。记录每个栈帧(Frame)中的局部变量、方法返回地址等。虚拟机栈的作用:主管Java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。栈帧的作用有存储数据,部分过程结果,处理动态链接,方法返回值和异常分派。
- Native Method Stack:本地(原生)方法栈,顾名思义就是调用操作系统原生本地方法时,所需要的内存区域。
虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。
2、所有线程共享的(Heap、Method Area 都是在虚拟机启动时创建,虚拟机退出时释放)
- 堆:对象实例、数组等
- 方法区(元空间):类结构、类成员定义、常量、静态变量、编译后的代码缓存
- 堆内存区:也是 GC 垃圾回收的主站场,用于存放类的实例对象及 Arrays 实例等
- Method Area:方法区,主要存放类结构、类成员定义,static 静态成员等。方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
其他参考图:
图片来自网络&课程,侵权可删。