什么是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操作、图形渲染等)