服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-11 更新于 2026-10-11 简米科技 3,151 字 7 分钟阅读

深入理解JVM虚拟机的工作原理,JVM垃圾回收机制详解

导读要深入理解JVM虚拟机的工作原理,不能只看pdf里的结论,而是把它拆成内存模型、类加载、执行引擎、垃圾回收四条主线,再配合jstack、jmap这些命令在真实场景里反复验证,JVM虚拟机.pdf怎么读?先建立整体认知框架一本几百页的JVM虚拟机.pdf,如果从头到尾逐页看,很容易迷失在细节里,行业共识认为,正确……

要深入理解JVM虚拟机的工作原理,不能只看pdf里的结论,而是把它拆成内存模型、类加载、执行引擎、垃圾回收四条主线,再配合jstack、jmap这些命令在真实场景里反复验证。

JVM虚拟机.pdf怎么读?先建立整体认知框架

一本几百页的JVM虚拟机.pdf,如果从头到尾逐页看,很容易迷失在细节里,行业共识认为,正确的读法是先建立一个“虚拟电脑”的类比:JVM就是一台跑在操作系统上的虚拟电脑,它有自己独立的“CPU”(执行引擎),有“内存条”(运行时数据区),有“硬盘”(方法区/元空间),还有“开机流程”(类加载子系统),把这个框架刻在脑子里,再去看每个章节,所有细节都能找到挂载的位置。

推荐按这个顺序读:

  • 先读类加载子系统,搞清楚.class字节码文件是从哪里来、怎么被装载进内存的。
  • 再读运行时数据区,知道程序计数器、虚拟机栈、堆、方法区各自负责什么,谁线程私有,谁线程共享。
  • 接着读执行引擎,理解字节码如何被解释执行,热点代码如何被JIT编译器编译成机器码。
  • 最后啃垃圾回收,弄明白对象什么时候被判定为“死人”,用什么算法来收尸。

这个顺序背后的逻辑是:类加载是入口,数据区是舞台,执行引擎是舞台上的演员,垃圾回收是保洁阿姨,入口没走通,后面全是毛线团。

JVM内存模型和类加载机制怎么理解?

这里要先澄清一个高频混淆点:JVM内存模型(通常说的JMM)和运行时数据区是两码事,JMM关注的是多线程间的可见性和有序性,而JVM运行时数据区才是一块一块的具体内存,我们这里聊的是后者。

运行时数据区的核心划分可以记成一张表:

深入理解JVM虚拟机的工作原理,JVM垃圾回收机制详解

区域 作用 特点
程序计数器 记录当前线程执行的字节码行号 线程私有,无OOM异常
虚拟机栈 存放方法调用产生的栈帧 线程私有,栈深度不足抛StackOverflowError
本地方法栈 为native方法服务 线程私有,同样有溢出风险
堆 几乎存放所有对象实例 线程共享,GC主战场,OOM高发地
方法区/元空间 存储类信息、常量、静态变量 JDK8以后用元空间替代永久代,占本地内存

关于类加载机制,重点在“加载-连接-初始化”三个阶段,连接里又包含验证、准备、解析,真正让你跟别人拉开差距的是双亲委派模型,业内专家指出,它的核心逻辑就是“向上委托,向下加载”:应用程序类加载器先把请求抛给扩展类加载器,扩展类加载器再抛给启动类加载器,只有父加载器加载不了,子加载器才自己动手,这样才能保证java.lang.Object这种核心类永远是被最顶层的加载器加载,防止被篡改。

想亲眼看看类加载的过程,可以写一个简单的Java程序,然后用这个命令启动:

java -verbose:class HelloWorld

控制台会刷出一行行类加载记录,从启动类加载器到应用程序类加载器,谁加载了哪个类,一目了然,比对着pdf空想强得多。

JVM垃圾回收器怎么选?CMS和G1实战对比

很多老项目还在用JDK8,所以CMS和G1的对比依旧是面试和线上选型绕不开的话题,虽然CMS在JDK9就被标记为废弃,JDK14彻底移除,但存量系统里CMS依然大量存在,新开发的系统基本都投向了G1。

深入理解JVM虚拟机的工作原理,JVM垃圾回收机制详解

对比维度 CMS G1
回收算法 标记-清除 Region化+分代收集
停顿目标 尽量缩短停顿,但不可预测 可设置预期的停顿时间目标
碎片问题 有,容易触发Full GC 通过复制算法基本消除碎片
适用场景 堆较小、低延迟的旧系统 堆较大、需要可控停顿的现代服务

怎么选?如果堆内存相对较小,比如几个GB的小应用,ParNew+CMS组合在很多旧项目里依然稳如老狗;如果堆内存较大,几十GB起步,业务要求GC停顿控制在几百毫秒内,直接上G1,再往后,JDK11+的ZGC在超大堆上的表现更亮眼,但那是另一个故事。

如何确认你的Java进程到底用的哪个收集器?执行下面这个命令:

java -XX:+PrintCommandLineFlags -version

输出里如果有-XX:+UseG1GC,说明当前是G1;如果是-XX:+UseConcMarkSweepGC,说明是CMS,不要猜,命令会告诉你答案。

JVM调优参数有哪些?线上OOM排查步骤

新手学JVM调优总想憋大招,其实线上最常用的参数就那么几个,先记住这五组:

  • -Xms 和 -Xmx:分别指定初始堆和最大堆,生产环境建议设成相同值,防止堆伸缩带来性能抖动。
  • -XX:MaxMetaspaceSize:限制元空间大小,避免类加载过多把本地内存占满。
  • -XX:+HeapDumpOnOutOfMemoryError:配合-XX:HeapDumpPath,OOM时自动导出堆快照,这是事故现场的第一手资料。
  • -XX:SurvivorRatio:调整年轻代中Eden区和Survivor区的比例,默认8:1:1可以满足多数场景。
  • -XX:+PrintGCDetails(JDK9后建议用-Xlog:gc):打印GC日志,用于事后分析。

线上OOM的排查步骤,建议按这条路径走:

  1. 先看监控或日志,确认是堆OOM、元空间OOM还是栈溢出,不同区域对应不同的处理方式。
  2. 进程还活着,马上用jmap -dump:format=b,file=/tmp/heap.hprof <pid>导出堆快照;进程已经死掉,就找启动参数里

    深入理解JVM虚拟机的工作原理,JVM垃圾回收机制详解

    -XX:HeapDumpOnOutOfMemoryError自动生成的hprof文件。

  3. 用MAT(Memory Analyzer)打开堆快照,看Dominator Tree,找保留内存最大的对象,重点关注业务线程的局部变量、静态集合、缓存类数据。
  4. 定位到代码后,判断是内存泄漏还是内存分配不足,泄漏就修引用关系,比如HashMap只存不删;不足就调大-Xmx,或者换更省内存的数据结构。

排查过程中,jstat -gcutil <pid> 1000每隔一秒输出一次GC情况,能帮你快速了解Eden、Old区占用和GC频率,判断是“慢性泄漏”还是“流量高峰导致的压力”。

深入理解JVM没有捷径

如果把JVM虚拟机.pdf当小说看,合上书就忘;当工具书看,遇到问题再翻,才真正值回票价,拿一台测试服务器,故意用-Xmx128m启动一个会创建大List的程序,亲手让它OOM,再用jmap和MAT走一遍排查流程,跑通一次之后,你对“堆”“栈”“GC”这些词的理解会完全不一样。

关于JVM虚拟机pdf的常见问题

JVM虚拟机.pdf和《深入理解Java虚拟机》第三版是什么关系?

市面上流传的JVM虚拟机.pdf多数是《深入理解Java虚拟机》第三版的电子版章节,也可能是一些机构整理的讲义,如果内容覆盖了元空间、G1调优、ZGC这些JDK8以来的新特性,说明版本够新,可以跟着学;如果还在大篇幅讲永久代和ParNew,就需要用新版资料做补充。

只看JVM虚拟机.pdf能应对面试吗?

把pdf中的类加载、运行时数据区、垃圾回收算法讲透,可以覆盖大部分初中级岗位的核心问题,不过高级岗位往往还会追问JIT编译原理、锁升级、GC日志中每个字段的数值含义,这些内容需要结合线上调优和源码阅读才能形成体感,建议边读边用jmap和jstat观察自己写的小程序,让每个结论都变成可验证的实操。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱