JVM架构图是怎样的?
一、JVM架构图概览
+--------------------------+
| 类加载子系统 |
| (Class Loader Subsystem)|
+--------------------------+↓
+--------------------------+
| 运行时数据区 |
| (Runtime Data Areas) |
| ├── 方法区/元空间 |
| ├── 堆 |
| ├── 程序计数器 |
| ├── 虚拟机栈 |
| └── 本地方法栈 |
+--------------------------+↓
+--------------------------+
| 执行引擎 |
| (Execution Engine) |
| ├── 解释器 |
| ├── JIT编译器 |
| └── 垃圾收集器 |
+--------------------------+↓
+--------------------------+
| 本地接口与库 |
| (Native Interface/Lib) |
| ├── JNI |
| └── 本地方法库 |
+---------------- catcher
二、核心组件详解
- 类加载子系统(Class Loader Subsystem)
- 功能:动态加载
.class
文件到方法区,并完成验证、准备、解析和初始化。 - 类加载器层次:
- 启动类加载器(Bootstrap):加载JRE核心类(如
rt.jar
)。 - 扩展类加载器(Extension):加载
jre/lib/ext
目录下的类。 - 应用类加载器(Application):加载用户类路径(ClassPath)中的类。
- 自定义类加载器:支持动态加载网络资源或实现热部署。
- 启动类加载器(Bootstrap):加载JRE核心类(如
- 运行时数据区(Runtime Data Areas)
- 线程共享区域:
- 方法区/元空间(Method Area/Metaspace):
- 存储类元数据(类结构、常量池、静态变量)。
- JDK 8前:永久代(PermGen),内存受JVM限制;JDK 均使其用本地内存,无固定上限。
- 堆(Heap):
- 存储对象实例和数组,分新生代(Eden + Survivor区)和老年代。
- 垃圾回收主要针对堆内存。
- 方法区/元空间(Method Area/Metaspace):
- 线程私有区域:
- 程序计数器(PC Register):记录当前指令地址,唯一不抛出OOM的区域。
- 虚拟机栈(VM Stack):每个方法调用创建一个栈帧(局部变量表、操作数栈)。
- 本地方法栈(Native Method Stack):服务本地方法(如C/C++)。
- 执行引擎(Execution Engine)
- 功能:将字节码转换为机器指令并执行。
- 核心组件:
- 解释器(Interpreter):逐行解释字节码,启动阶段使用。
- 即时编译器(JIT Compiler):
- 将热点代码编译为本地机器码,提升性能(如G1/ZGC收集器)。
- 垃圾收集器(Garbage Collector):
- 管理堆和方法区内存,算法包括分代收集、标记-整理等。
- 本地接口(Native Interface)
- 功能:允许Java调用本地方法(如C/C++库)。
- 核心组件:
- JNI(Java Native Interface):提供API实现跨语言交互。
- 本地方法库(Native Method Libraries):存储本地代码实现。
三、JVM执行流程
- 编译:Java源码 → 字节码(
.class
文件)。 - 加载:类加载子系统将字节码加载到方法区。
- 执行:
- 解释器逐行执行字节码,JIT编译器优化热点代码。
- 线程通过虚拟机栈执行方法,程序计数器记录指令地址。
- 内存管理:
- 堆分配对象实例,GC回收无用对象。
- 方法区存储类元数据,元空间溢出时抛
OutOfMemoryError: Metaspace
。
四、关键优化点
- 堆内存:通过
-Xms
、-Xmx
设置初始和最大堆大小。 - 元空间:通过
-XX:MetaspaceSize
、-XX:MaxMetaspaceSize
限制元空间大小。 - 垃圾收集器:选择G1、ZGC等低延迟收集器(如
-XX:+UseG1GC
)。
五、JDK版本演进
- JDK 8:永久代(PermGen)被元空间(Metaspace)取代,元空间使用本地内存。
- JDK 11+:ZGC成为正式特性,支持低延迟垃圾回收。
通过以上架构图和组件关系,可清晰理解JVM如何实现跨平台、自动内存管理及高效执行。实际应用中需结合监控工具(如VisualVM、JConsole)进行性能调优。