欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 从零开始学JVM:Java虚拟机入门指南

从零开始学JVM:Java虚拟机入门指南

2025/3/29 17:47:59 来源:https://blog.csdn.net/weixin_57800914/article/details/146468799  浏览:    关键词:从零开始学JVM:Java虚拟机入门指南

一、JVM 是什么?为什么要学习它?

想象你写了一封中文信,需要让全世界的人都能看懂。这时你需要一个翻译,把中文翻译成英文、法文、日文等。JVM(Java 虚拟机)就是这样的翻译官,它把 Java 代码翻译成不同计算机能理解的语言,实现 "一次编写,到处运行"。

为什么要学 JVM?

  • 面试必备:内存管理、垃圾回收是高频考点
  • 性能优化:了解 JVM 原理才能写出高效代码
  • 问题排查:线上 OOM、Full GC 问题需要 JVM 知识解决

二、JVM 内存结构:程序运行的 "虚拟工厂"

JVM 的内存可以想象成一个大型工厂,包含五个不同功能的车间:

1. 程序计数器(线程的 "小黑板")

  • 作用:记录当前线程执行的代码位置
  • 特点:每个线程独有,内存极小(约 1KB)
  • 比喻:就像演唱会的提词器,演员(线程)靠它记住台词顺序

2. Java 栈(方法调用的 "记录本")

  • 作用:存储方法调用的详细信息(参数、局部变量等)
  • 栈帧结构
    • 局部变量表:存放方法中的变量(如int a = 10
    • 操作数栈:计算时的临时存储区(如计算a + b
    • 动态链接:指向方法区的指针
  • 案例
    public void calculate() {int x = 5;int y = 10;int sum = add(x, y); // 调用add方法时压入新栈帧
    }
    

3. 本地方法栈(调用外部资源的 "翻译官")

  • 作用:让 Java 调用 C/C++ 等本地代码
  • 常见场景:操作硬件、数据库连接(如 JDBC)

4. 堆(对象的 "大型仓库")

  • 作用:存放所有new出来的对象
  • 特点
    • 线程共享
    • 自动垃圾回收
    • 可通过参数调整大小(如-Xms2g设置初始堆内存)
  • 分代结构
    • 新生代:新创建的对象(存活时间短)
    • 老年代:存活时间长的对象(如缓存数据)
    • 元空间:存储类信息、常量(JDK8 后使用)

5. 方法区(类的 "字典库")

  • 作用:存储类的定义、静态变量、常量
  • JDK8 变化:从永久代变为元空间,使用本地内存

内存区域总结表

区域作用线程可见性垃圾回收
程序计数器记录代码执行位置私有
Java 栈存储方法调用信息私有
本地方法栈支持本地方法调用私有
存储对象实例共享
方法区 / 元空间存储类元数据共享

三、类加载机制:JVM 如何读懂 Java 代码

类加载过程就像组装一辆汽车,分为五个步骤:

1. 加载(把零件运到工厂)

  • 过程
    1. 通过类加载器找到.class文件
    2. 读取文件内容,生成Class对象
  • 类加载器层次
    • 根加载器:加载 Java 核心库(如java.lang.*
    • 扩展加载器:加载jre/lib/ext目录下的类
    • 应用加载器:加载项目中的自定义类

2. 验证(检查零件是否合格)

  • 验证内容
    • 文件格式是否正确(如魔数 0xCAFEBABE)
    • 字节码指令是否合法
    • 类继承关系是否合理

3. 准备(分配初始空间)

  • 任务
    • 为静态变量分配内存
    • 设置默认初始值(如static int a = 10初始为 0)

4. 解析(把零件名称转换为具体位置)

  • 任务
    • 将类名、方法名等符号引用转为内存地址
    • 例如将java.lang.Object转为实际内存地址

5. 初始化(启动汽车引擎)

  • 触发条件
    • 首次创建对象(new MyClass()
    • 调用静态方法 / 变量
    • 使用反射(Class.forName("MyClass")

初始化顺序口诀
父类静态变量 → 父类静态代码块 → 子类静态变量 → 子类静态代码块 → 父类构造方法 → 子类构造方法

四、执行引擎:JVM 如何执行代码

执行引擎就像工厂的生产线,包含三个核心组件:

1. 解释器(逐行翻译)

  • 工作方式
    1. 读取字节码指令
    2. 逐条翻译成机器码并执行
  • 优点:启动快,适合小程序
  • 缺点:执行效率低,就像逐句翻译小说

2. JIT 编译器(批量优化翻译)

  • 作用
    1. 识别 "热点代码"(如循环、高频方法)
    2. 编译为机器码缓存,提高执行速度
  • 编译策略
    • C1 编译器:快速编译,优化较少
    • C2 编译器:深度优化,适合复杂代码

3. 垃圾回收器(自动清洁工)

3.1 垃圾回收核心概念

如何判断对象可回收?

  • 可达性分析:从 GC Roots(如栈中的变量)出发,无法到达的对象会被回收

    java

    Object obj = new Object(); // obj可达
    obj = null; // obj不可达,等待回收
    

引用类型

类型说明示例场景
强引用默认类型,不会被回收普通对象引用
软引用内存不足时回收缓存系统
弱引用下次 GC 时回收ThreadLocal 的值
虚引用仅用于跟踪对象销毁内存监控
3.2 垃圾回收算法

算法 1:标记 - 清除(基础方法)

  1. 标记:遍历所有对象,标记存活对象
  2. 清除:回收未标记的对象
  • 优点:实现简单
  • 缺点:产生内存碎片

算法 2:复制算法(新生代常用)

  1. 将内存分为两块(Eden 和 Survivor)
  2. 存活对象复制到空块,清空原块
  • 优点:无碎片,速度快
  • 缺点:浪费 50% 空间

算法 3:标记 - 整理(老年代常用)

  1. 标记存活对象
  2. 将存活对象移动到内存一端
  3. 清除尾部空间
  • 优点:无碎片
  • 缺点:移动对象耗时

算法 4:分代回收(组合使用)

  • 新生代:复制算法(对象存活率低)
  • 老年代:标记 - 整理(对象存活率高)
3.3 垃圾回收器对比
回收器特点适用场景停顿时间
Serial单线程,简单高效客户端程序
Parallel多线程,吞吐量优先批处理任务中等
CMS并发低停顿Web 服务器
G1分区 + 并发,停顿可控大内存应用可控
ZGC超高性能,停顿 < 10ms超大内存场景极短

G1 回收器核心概念

  • 将堆分成 2048 个 Region
  • 优先回收垃圾最多的 Region(Garbage-First)
3.4 垃圾回收调优

常用命令

jstat -gcutil 1234 250 20  # 监控GC情况(每250ms一次,共20次)
jmap -dump:file=heap.hprof 1234  # 生成堆转储文件

内存泄漏排查步骤

  1. 使用jstat发现内存持续增长
  2. 生成堆转储文件,用 MAT 工具分析
  3. 定位大对象,检查是否有未释放的引用
    static List<Object> cache = new ArrayList<>();
    public void addCache() {cache.add(new Object()); // 内存泄漏示例
    }
    

五、JVM 性能调优:让程序跑更快

1. 常用工具

  • JConsole:图形化监控内存、线程、CPU
  • VisualVM:分析堆转储文件,查看 JVM 参数
  • Arthas:动态诊断线上问题(如热修复)

2. 调优参数示例

# 内存设置
-Xms2g -Xmx2g  # 初始和最大堆内存
-XX:NewRatio=2  # 新生代占1/3,老年代占2/3# 垃圾回收
-XX:+UseG1GC    # 使用G1回收器
-XX:MaxGCPauseMillis=200  # 最大停顿时间# 编译优化
-XX:+TieredCompilation  # 分层编译

3. 调优案例

问题:系统响应变慢,频繁 Full GC
解决

  1. jstat发现老年代内存使用率 100%
  2. 分析堆转储找到大对象(如缓存对象)
  3. 优化缓存策略,使用弱引用
  4. 调整 G1 参数:-XX:G1HeapRegionSize=32m

六、JVM 发展趋势

  1. 虚拟线程(Project Loom):简化高并发编程,支持百万级线程
  2. ZGC:支持 TB 级内存,停顿时间控制在 10ms 以内
  3. AOT 编译:提前编译减少启动时间
  4. 容器化适配:优化 Kubernetes 等云环境下的内存管理

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词