四大核心部分
1. 类加载子系统 (Class Loader Subsystem)
这是 JVM 的"入口",负责将静态的 .class 文件加载到内存中。
- 核心职责:负责加载、链接(验证、准备、解析)和初始化类文件。
- 工作机制 :它通过双亲委派模型(Parent Delegation Model)来确保类加载的安全性和唯一性,防止核心 API 被篡改。
- 执行者- 类加载器:是 JVM 类加载子系统(Class Loading Subsystem) 的核心执行者
2. 运行时数据区 (Runtime Data Area 极其重要)
线程私有区域
程序计数器 :记录当前线程执行的字节码行号,是唯一没有规定内存溢出的区域。
虚拟机栈:描述 Java 方法执行的内存模型,存储局部变量、操作数栈等(栈帧)。包含:
局部变量表、
操作数栈(用于临时存放中间数据,具体执行还是需要cpu)、
指向运行时常量池的引用、
方法返回地址(返回下一条要执行的指令地址)、
动态连接(编译之后有很多符号引用)
栈侦详解
设置栈大小:(通常不会手动的设置)
-Xss1m (默认) (重要)


本地方法栈 :为 Native 方法(C/C++ 编写)服务。
线程共享区域
堆 (Heap):存放对象实例 和数组,是垃圾回收(GC)的要区域。
**[堆对象的结构](https://blog.csdn.net/a308495564s/article/details/119521487):** 对象头、对象体、对齐字节。

java
// 堆溢出OOM (visual GC工具)
public static void main(String[] args) {
List<String> list = new ArrayList<>();
//死循环
for (int i = 0; ; i++) {
System.out.println("execute... ..."+i);
list.add(new String(new byte[1024*1024*100]));
}
}
堆分类
堆: heap, 年轻代+老年代
非堆: non-heap , jvm除了heap以外的内存区域
离堆: off-heap , jvm外的内存区域(物理内存,本地计算机内存)
- 方法区 (Method Area / Metaspace)
JDK 6 及以前 :静态变量和字符串常量池都在永久代(堆内 受制于-xmx)。
JDK 7: 静态变量和字符串常量池被迁移到Java 堆(就是常说的堆区)。永久代只剩下类元数据。
JDK 8 及以后:类元数据被迁移到元空间(堆外,而静态变量和字符串常量 池依然留在Java 堆。
注意: 字符串常量池在堆区,运行时常量池在元空间。
3. 执行引擎 (Execution Engine)
这是 JVM 的"大脑",负责执行字节码指令。
- 解释器 (Interpreter):逐行读取并解释字节码,启动速度快,但执行效率相对较低。
- 即时编译器 (JIT Compiler):将频繁执行的"热点代码"编译成本地机器码并缓存,大幅提升运行效率。
- 垃圾回收器 (Garbage Collector, GC):架构上它属于执行引擎的一部分,负责自动回收堆内存中不再使用的对象。
4. 本地方法接口 (Native Interface / JNI)
这是 JVM 与外部世界交互的"桥梁"。
- 作用:融合不同的编程语言。当 Java 代码需要调用非 Java 语言(如 C、C++)编写的本地库时,通过 JNI 进行交互。
- 本地方法库:JNI 调用底层的本地方法库(如操作系统层面的文件 IO、网络通信库)。
5.图示总结
