JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。 JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。
解释运行、内存管理和即时编译——JVM:我今天运行起来只为三件事(
解释运行![[assets/JVM/file-20250508211934315.png]]
内存管理
即时编译 对热点代码进行优化,提升执行效率。即时编译可以说是提升Java程序性能最核心的手段
![[assets/JVM/file-20250508215423528.png]]
类加载器系统
运行时数据区
执行引擎
本地方法接口(JNI, Java Native Interface)
JMM(Java Memory Model),官方名称为运行时数据区域。
JVM在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。这里我们根据线程是否共享,可以简单地分为主内存和工作内存。![[assets/JVM/file-20250721162725868.png]]
从上面主内存和工作内存的区分,当我们将JVM视作一个操作系统,两个内存。我们可以认为一个是程序里面的内存,负责运行程序中的变量、方法等数据;另外一个是我们计算机的内存,负责在我们电脑开机运行过程中数据的管理
工作内存,也就是线程私有的内存,分为三个区域:
功能类似于CPU的PC计数器,但是在JVM中不同于CPU中的PC计数器,JVM中的程序计数器是每个线程独立拥有一个的。
如此一来,各线程之间计数器互不影响,独立存储,便于线程切换后的恢复
程序计数器主要有两个作用:
Java 虚拟机栈(后文简称栈)也是线程私有的,它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。
回顾操作系统角度的JVM,虚拟机栈在这里作为程序(工作内存)的内部栈。一个程序在运行过程中是会调用很多方法,然后在各个方法之间进入返回,而栈的结构就类似方法之间的进出。
![[assets/JVM/file-20250721164540439.png]] 栈的每次压入弹出,就相当于我们进入方法、计算处理,然后返回结果。而在方法中又有许多信息需要存储和读取,所以栈中又有许多栈帧,每个栈帧中都拥有:
和虚拟机栈所发挥的作用非常相似,区别是:虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。
主内存是所有线程共享的内存