目录
1- 引言:初识JVM
1-1 JVM是什么?(What)
1-1-1 概念
- Java Virtual Machine :JAVA运行时环境(java 二进制字节码的运行环境)
- Java 的二进制字节码的运行环境。我们都知道 Java 代码想要运行的话,就必须得先经过编译,之后编译成
.class
文件才能运行,JVM就是.class
二进制字节码的运行环境。
1-1-2 优点
- 一次编译,到处执行
- JVM实现一次编译,到处运行的原理是通过屏蔽操作系统的差异来实现的。具体来说,Java代码编译成二进制字节码后,这些字节码在不同操作系统上的JVM中都可以运行。
- JVM作为一个软件层,运行在操作系统上,无论是 Windows 还是 Linux,真正运行 Java 代码的是JVM 而不是操作系统。因此,JVM 使得 Java 能够跨平台执行,实现了“一次编写,到处运行”。
- 自动内存管理,垃圾回收机制
- JVM的第二个优点是自动内存管理和垃圾回收机制。与C语言需要程序员手动管理内存不同,Java虚拟机通过自动垃圾回收功能,大大减轻了程序员的负担,减少了内存泄漏的风险,从而提高了程序的稳定性和开发效率。
1-2 为什么学习JVM?(Why)
- 学习 JVM 以便我们能够 深入理解Java,一旦掌握了 JVM,也就知道了 Java 的运行机制,特别对于排查问题的能力将会有大幅度提升。
- ① 了解 JAVA 运行机制
- ② 提升排查问题的能力(内存泄漏、CPU飙升等)
2- 核心:JVM工作的原理(How)
⭐2-1 JVM 的组成部分及工作流程
- Java源代码到类加载子系统
⭐作用: 将Java源代码转化为JVM能够理解和执行的格式,并将这些格式正确加载到JVM中。
- Java Source (Java源代码):编写的 Java 源代码文件,通常以
.java
为扩展名。 - Java Class (Java类文件):通过Java编译器(
javac
)将Java源代码编译成字节码文件,通常以.class
为扩展名。 - 类加载子系统:负责将编译后的
.class
文件加载到 JVM 中,进行加载、验证、准备、解析和初始化。类加载子系统的作用是将.class
文件转换为 JVM 可以执行的内部表示,并将其放入运行时数据区。
- 运行时数据区
⭐作用: 运行时数据区是JVM在执行Java程序时所需的内存区域,包含了程序执行过程中所需的数据和信息。
- Method Area/MetaSpace (方法区/元空间):存储类结构信息,如运行时常量池、字段和方法数据、方法和构造函数的字节码内容。
- Heap (堆):用于存储对象实例和数组,是垃圾回收的主要区域。
- PC Register (程序计数器):记录当前线程正在执行的字节码指令地址。
- JVM Stacks (虚拟机栈):每个线程私有,用于存储局部变量、操作数栈、动态链接和方法调用等信息。
- Native Method Stack (本地方法栈):每个线程私有,用于存储本地方法调用的信息。
- 执行引擎
⭐作用: 执行引擎负责将字节码转换为机器码并执行,确保Java程序高效运行,并通过垃圾回收机制管理内存。
- Interpreter (解释器):逐行解释执行字节码指令,将每条字节码指令翻译成相应的机器码并执行。
- JIT Compiler (即时编译器):将热点代码(频繁执行的代码段)编译成机器码,提高执行效率。
- GC (垃圾回收):负责自动回收不再使用的对象,释放内存空间,防止内存泄漏。
- 本地方法接口和本地库
⭐**作用:**本地方法接口和本地库使Java程序能够调用和执行平台相关的功能和库,扩展了Java的能力,使其可以与底层系统进行交互。
- 本地方法接口 (JNI):允许Java代码调用本地(通常是 C 或 C++)代码,提供与操作系统或其他底层库的接口。
- 本地库 (Native Libraries):提供本地方法实现的库文件,通常以动态链接库(如
**.dll**
、**.so**
)的形式存在。
2-2 学习侧重点
- 对于 JVM 组成:主要关注 JVM 的运行时数据区。
- 类加载器:类加载子系统中的类加载器
- 垃圾回收:运行时数据区堆中对象的回收
- JVM实践