Loading

JVM底层原理

JVM底层原理详解

https://javaguide.cn/java/jvm/jvm-garbage-collection.html

JVM(Java虚拟机)是Java程序运行的核心环境,其底层原理涉及类加载、内存管理、执行引擎、垃圾回收等多个关键机制。以下是JVM的核心原理及工作流程:


1. 类加载机制

JVM通过类加载器(ClassLoader)将字节码(.class文件)加载到内存,并生成对应的Class对象。类加载过程分为三个阶段:

  1. 加载(Loading):查找并加载类的二进制数据到内存,生成Class对象。
  2. 链接(Linking)
    • 验证(Verification):检查字节码的格式和安全性。
    • 准备(Preparation):为静态变量分配内存并初始化默认值(如int初始化为0)。
    • 解析(Resolution):将符号引用转换为直接引用(如方法调用的具体地址)。
  3. 初始化(Initialization):执行静态代码块(<clinit>方法),为静态变量赋实际值。

类加载器分类

  • 启动类加载器(Bootstrap ClassLoader):C++实现,加载核心库(如java.lang包)。
  • 扩展类加载器(Extension ClassLoader):加载jre/lib/ext目录下的扩展类。
  • 应用类加载器(AppClassLoader):加载用户类路径(ClassPath)的类。
  • 自定义加载器:用户继承ClassLoader实现,用于动态加载特定类(如热部署)。

双亲委派模型:类加载请求优先委派给父加载器处理,避免核心类被篡改,保障安全性。


2. 内存结构与运行时数据区

JVM内存分为以下核心区域:

  1. 堆(Heap)

    • 作用:存放所有对象实例和数组。
    • 分区
      • 新生代(Young Generation):包括Eden区、Survivor区(From/To),新对象在此分配,通过复制算法回收。
      • 老年代(Old Generation):长期存活的对象晋升至此,使用标记-清除标记-整理算法回收。
  2. 方法区(Method Area)

    • 作用:存储类信息、常量、静态变量、JIT编译后的代码。
    • 实现:JDK8后由元空间(Metaspace)替代永久代,使用本地内存(Native Memory),避免OOM。
  3. 虚拟机栈(Java Stack)

    • 作用:线程私有,存储方法调用的栈帧(局部变量表、操作数栈、动态链接、方法出口)。
    • 异常:栈深度过大引发StackOverflowError;动态扩展失败导致OutOfMemoryError
  4. 本地方法栈(Native Method Stack)

    • 作用:为JNI(Native方法)提供栈空间,如C/C++库调用。
  5. 程序计数器(PC Register)

    • 作用:记录当前线程执行的字节码指令地址,线程私有,唯一无OOM的区域。

3. 执行引擎与代码执行

JVM通过解释器即时编译器(JIT)执行字节码:

  1. 解释器:逐行解释字节码为机器码,启动快但效率低。
  2. JIT编译器:将热点代码(频繁执行的方法或循环)编译为本地机器码,提升执行效率。

热点探测

  • 方法调用计数器:统计方法调用次数(阈值默认1万次,Server模式)。
  • 回边计数器:统计循环执行次数,触发栈上替换(OSR)编译。

优化技术

  • 逃逸分析:对象未逃逸方法时可栈上分配,减少堆压力。
  • 内联优化:将小方法代码直接嵌入调用处,减少方法调用开销。

4. 垃圾回收(GC)机制

JVM通过自动垃圾回收管理堆内存,核心算法包括:

  1. 分代收集

    • 新生代:使用复制算法(Eden → Survivor区复制存活对象)。
    • 老年代:使用标记-清除(产生内存碎片)或标记-整理(整理碎片)。
  2. 垃圾回收器

    • Serial/Parallel:单线程/多线程收集,适合低延迟或高吞吐场景。
    • CMS:并发标记清除,减少停顿时间,但存在碎片问题。
    • G1:分区域收集,可预测停顿时间,兼顾吞吐和延迟。

GC触发条件

  • Minor GC:Eden区满时触发。
  • Full GC:老年代空间不足或元空间溢出时触发,停顿时间长。

5. 内存分配策略

  1. 对象优先在Eden区分配:新对象在Eden区分配,若空间不足触发Minor GC。
  2. 大对象直接进入老年代:避免在新生代频繁复制(如长字符串、大数组)。
  3. 长期存活对象晋升:对象年龄(Survivor区存活次数)超过阈值(默认15)进入老年代。

6. 性能调优与工具

  1. 参数调优
    • -Xms/-Xmx:设置堆初始和最大值。
    • -XX:NewRatio:调整新生代与老年代比例。
  2. 监控工具
    • jstat:监控堆内存和GC情况。
    • jmap:生成堆转储快照(Heap Dump)。
    • jstack:分析线程快照,定位死锁或阻塞。

总结

JVM通过类加载、内存管理、执行引擎和垃圾回收等机制实现“一次编写,到处运行”的跨平台特性。理解其底层原理有助于优化程序性能(如减少Full GC频率、合理分配内存),并快速定位内存泄漏、OOM等问题。

posted @ 2025-05-13 14:19  我不想学编丿程  阅读(41)  评论(0)    收藏  举报