JVM虚拟机详解
什么是JVM
JVM的全称是Java Virtual Machine。它的本质是一个软件,在不同的平台有不同的版本,可以将Java字节码翻译成对应平台的机器码并执行,实现了Java代码一次编译,到处运行的跨平台特性。
JVM的组成

类加载器
- 作用:负责将.class文件(字节码)加载到JVM中,并验证、准备、解析类信息。
- 核心步骤:
- 加载:从文件中读取字节码,生成Class对象
- 验证: 确保字节码符合相关规范(安全检查)
- 准备:为类变量(static变量)分配内存并设置默认数值
- 解析:将符号引用(如类名、方法名)转化为直接内存地址
- 关键机制:双亲委派模型(避免类重复加载,保证安全)
运行数据区(Runtime Data Area)
这是JVM管理内存的核心区域,所有数据都在这里存储,具体如下:
- 程序计数器(Program Counter Register):
- 记录当前线程执行的字节码地址
- 每个线程有独立的程序计数器
- 虚拟机栈(VM Stack):
- 存储方法调用时的局部变量、操作数栈、返回地址等
- 同样是线程私有,栈深度过深会导致StackOverflowError(例如过深的递归)
- 本地方法栈(Native Method Stack):
- 类似虚拟机栈,但是专为Native方法服务(比如一些C/C++实现的方法)
- 堆(heap):
- JVM中最大的内存区域,存储对象示例和数组
- 所有线程共享,是垃圾回收的主要区域
- 方法区(Method Area)
- 存储类信息(结构、方法、常量)、静态变量、运行常量池
- 线程共享,JDK8之后由元空间(Metaspace)实现(直接使用系统内存)
执行引擎(Execute Engine)
- 作用:将字节码翻译成机器码并执行(JVM的CPU)
- 核心组件:
- 解释器:逐行翻译字节码并执行,启动快但效率低
- 及时编译器(JIT):即Just-In-Time Compiler,将热点代码(频繁执行的代码)编译为机器码缓存,提升运行效率
- 垃圾回收器(GC):自动回收堆中不再使用的对象内存
本地方法接口(Native Method Interface,JNI)
- 作用:作为Java代码与本地代码方法的桥梁。
- 场景:当Java无法直接操作底层硬件或者系统资源时,通过JNI调用本地方法实现(例如IO操作、图形渲染等)