JVM的四大组件是什么?
- 类加载子系统(Class Loader Subsystem)
- 功能:负责将编译后的字节码(
.class
文件)加载到JVM内存中,并完成验证、准备、解析和初始化等步骤。 - 核心组件:
- 类加载器(ClassLoader):
- 启动类加载器(Bootstrap ClassLoader):用C++实现,加载JRE核心类库(如
rt.jar
)。 - 扩展类加载器(Extension ClassLoader):加载
jre/lib/ext
目录下的类库。 - 应用程序类加载器(Application ClassLoader):加载用户类路径(ClassPath)中的类。
- 启动类加载器(Bootstrap ClassLoader):用C++实现,加载JRE核心类库(如
- 双亲委派模型:子加载器优先委托父加载器加载类,避免重复加载和核心类篡改,但SPI(如JDBC)等场景会通过线程上下文类加载器打破此模型。
- 类加载器(ClassLoader):
- 运行时数据区(Runtime Data Area)
- 功能:管理JVM运行时的内存空间,分为线程共享和线程私有区域。
- 核心区域:
- 线程共享区域:
- 堆(Heap):存储所有对象实例和数组,是垃圾回收器(GC)管理的核心区域。
- 方法区/元空间(Method Area/Metaspace):存储类元数据(类结构、静态变量、常量池等)。
- 线程私有区域:
- 程序计数器(PC Register):记录当前线程执行的字节码指令地址,唯一不抛出OOM的区域。
- 虚拟机栈(VM Stack):每个方法调用创建一个栈帧(Stack Frame),包含局部变量表、操作数栈等。
- 本地方法栈(Native Method Stack):为本地方法(如C/C++)服务。
- 线程共享区域:
- 执行引擎(Execution Engine)
- 功能:将字节码转换为机器指令并执行。
- 核心组件:
- 解释器(Interpreter):逐行解释字节码,启动阶段使用,执行效率较低。
- 即时编译器(JIT Compiler):将热点代码(高频执行代码)编译为本地机器码,提升性能。
- 垃圾收集器(Garbage Collector, GC):自动回收堆和方法区中的无用对象,常用算法包括分代收集、G1/ZGC等。
- 本地接口(Native Interface)
- 功能:允许Java代码调用本地方法(如C/C++编写的库),实现与异构系统的交互。
- 核心组件:
- JNI(Java Native Interface):提供API实现Java与本地代码的交互。
- 本地方法库(Native Method Libraries):存储本地代码的实现。
组件协作流程
- 类加载:类加载子系统加载字节码到方法区。
- 内存分配:运行时数据区分配堆内存给对象实例,线程私有区域存储局部变量和执行上下文。
- 执行与优化:执行引擎解释字节码或编译为本地代码,同时垃圾收集器回收无用内存。
- 本地调用:通过本地接口调用非Java代码,扩展JVM功能。
通过这四大组件的协同,JVM实现了Java的跨平台性、自动内存管理及高效执行。理解这些组件有助于优化程序性能、排查内存问题及设计高并发系统。