《JVM G1源码分析和调优》权威学习地图
依据彭成寒《JVM G1源码分析和调优》完整目录独立重构:沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径
《JVM G1源码分析和调优》权威学习地图
本页对应原书正式结构中的 《JVM G1源码分析和调优》权威学习地图。课程不复制原文,而是按目录节点独立还原算法、jdk8u60 HotSpot源码路径、日志语义和调优证据。当前任务是:沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径。
可验收学习目标
学习目标
- 能解释本页15个正式节点在G1对象图、线程、Region与回收周期中的责任。
- 能实现一个固定源码提交、JDK、堆、参数、工作量和停止条件的可重复GC实验。
- 能比较源码分支、统一时间线日志、对象状态与性能指标,区分相关性和因果。
- 能设计失败反例、资源隔离、参数回滚与版本迁移记录,让他人独立重放。
本页交付 135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。首要陷阱是“把G1学习缩成Young、Mixed、Full三张流程图,遗漏分配、Refine、引用、去重、安全点、选型和源码工具”。所有参数实验必须先预测收益和负面影响,再运行。
官方目录逐节点复刻
第1章 垃圾回收概述
正式节点 1/15。 把术语放回对象图、线程和时间线,说明输入、状态变化、日志证据与调优副作用;源码和日志必须来自同一版本。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第1章 垃圾回收概述”。
第2章 G1的基本概念
正式节点 2/15。 把术语放回对象图、线程和时间线,说明输入、状态变化、日志证据与调优副作用;源码和日志必须来自同一版本。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第2章 G1的基本概念”。
第3章 G1的对象分配
正式节点 3/15。 沿TLAB快速路径、Region慢路径和Humongous连续分区记录分配,区分Java请求大小、对齐后大小、浪费与失败触发。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第3章 G1的对象分配”。
第4章 G1的Refine线程
正式节点 4/15。 从跨Region写入经过写屏障、Dirty Card Queue、Refine线程到RSet更新,记录队列水位和Mutator协助成本。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第4章 G1的Refine线程”。
第5章 新生代回收
正式节点 5/15。 逐阶段记录CSet、根、RSet、复制、重脏和释放,按并行工作线程比较耗时、存活率、晋升和预测误差。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第5章 新生代回收”。
第6章 混合回收
正式节点 6/15。 用三色对象图和SATB不变量解释并发修改,沿初始标记、根扫描、并发、再标记、清理与Mixed启动保全证据。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第6章 混合回收”。
第7章 Full GC
正式节点 7/15。 区分疏散失败、串行与并行Full GC,逐步验证标记、地址计算、引用更新、对象移动和后处理,并标明JDK版本。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第7章 Full GC”。
第8章 G1中的引用处理
正式节点 8/15。 画出referent从可达、发现、处理、清除、重新可达与入队的状态,使用ReferenceQueue和日志验证而非依赖一次GC。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第8章 G1中的引用处理”。
第9章 G1的新特性:字符串去重
正式节点 9/15。 基于字符串内容分布测量候选、去重与表成本,区分共享底层值和intern规范语义,报告CPU与内存净收益。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第9章 G1的新特性:字符串去重”。
第10章 线程中的安全点
正式节点 10/15。 将到达安全点时间与安全点内工作拆开,按线程状态和轮询位置解释延迟;GC阶段耗时不能覆盖TTSP。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第10章 线程中的安全点”。
第11章 垃圾回收器的选择
正式节点 11/15。 先定义SLO、工作量和基线,再从日志提出单一参数假设;同时报告停顿、吞吐、CPU、内存、失败和回滚,不能只展示改善指标。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第11章 垃圾回收器的选择”。
第12章 新一代垃圾回收器
正式节点 12/15。 把术语放回对象图、线程和时间线,说明输入、状态变化、日志证据与调优副作用;源码和日志必须来自同一版本。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“第12章 新一代垃圾回收器”。
附录A 编译调试JVM
正式节点 13/15。 记录源码提交、构建类型、符号、命令和工具边界,区分HotSpot删节片段、真实C++实现与运行时证据。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“附录A 编译调试JVM”。
附录B 本地内存跟踪
正式节点 14/15。 记录源码提交、构建类型、符号、命令和工具边界,区分HotSpot删节片段、真实C++实现与运行时证据。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“附录B 本地内存跟踪”。
附录C 阅读JVM需要了解的C++知识
正式节点 15/15。 记录源码提交、构建类型、符号、命令和工具边界,区分HotSpot删节片段、真实C++实现与运行时证据。节点结论服务于“沿12章与附录A-C建立从GC算法、G1源码、日志到调优和后继收集器的完整证据路径”,并写入135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单。
先预测一个能排除当前解释的结果,再运行基线与单变量对照。验收注明源码提交、JDK、参数、堆、工作量、采集窗口和单位;若只有流程背诵或工具截图,就没有覆盖“附录C 阅读JVM需要了解的C++知识”。
从Region和时间线开始
G1把堆划分为大小相等的Region,但Region不是固定代;Eden、Survivor、Old、Humongous与空闲状态会随分配和回收改变。↡一次暂停中计划回收的一组Region决定本轮扫描和复制边界,↡记录其他Region中指向本Region引用位置的反向索引避免每次扫描整个堆。任何流程图都要同时标出对象来源、目标Region、引用更新和失败余量。
写入引用时,G1通过写屏障把脏卡放入队列,后台Refine线程更新RSet;当队列积压跨过区间,应用线程也可能承担处理。↡记录待精炼脏卡地址的线程本地或全局队列连接应用写入与后续扫描。调优Refine不能只看后台线程CPU,还要观察Mutator协助、队列水位、跨Region引用率和暂停中的RSet扫描成本。
G1的停顿目标是预测输入,不是硬实时保证。↡使用近期阶段耗时及偏差估计给定停顿预算能容纳多少回收工作的模型影响年轻代长度和CSet选择,但实际时间还取决于存活率、RSet、复制带宽、工作线程平衡与安全点。缩短目标可能增加GC频率和CPU,放宽目标可能扩大年轻代和单次复制;所以收益必须在完整工作量中衡量。
并发标记遵守SATB视图,允许应用线程继续修改对象图,并通过屏障保留必要引用。↡并发标记开始时逻辑对象图的快照语义,通过写屏障避免漏标不意味着没有浮动垃圾,也不负责移动对象。初始标记、根区扫描、并发标记、再标记和清理必须与之后的Mixed回收区分;Mixed才会在暂停中疏散选中的Old Region。
对象复制需要目标空间。存活估计错误、Humongous碎片、并发周期过晚或分配突增可能导致↡暂停疏散时目标空间不足,部分对象无法按计划复制的失败状态,进一步走向Full GC。修复不能只加堆;还要确认并发标记启动、存活集、Region余量、分配速率、引用处理和安全点。Full GC后的暂时恢复只说明状态被压缩,不证明根因消失。
源码、日志与版本证据
原书源码基线jdk8u60的G1目录和后续OpenJDK不同。每条源码结论记录仓库、提交、文件、函数、调用者和关键条件;书中为讲解而删节的大括号、统计和辅助路径不能当作可编译原文。对JDK 10并行Full GC,必须切换到对应仓库重新建立调用链,禁止把两个版本片段拼成一个虚构实现。
日志按统一时钟构建阶段树:暂停开始与结束、到达安全点、根扫描、RSet更新、对象复制、引用处理、清理和并发阶段。总停顿等于多个阶段和同步成本,阶段并行也可能因负载不均产生长尾。先保存原始日志,再解析;解析器必须匹配JDK格式,未知字段不能静默丢弃。
参数分产品、诊断、实验和开发类别,适用性取决于构建与版本。参数存在不表示应修改。每次只改变一项,记录默认值来源、预测机制、成功指标、负面指标和回滚阈值。若日志改善但吞吐、CPU、RSS、错误率或恢复时间恶化,不能称为调优成功。
安全点是独立诊断维度。应用停止前等待线程到达安全点的时间不等于GC阶段执行时间;长本地调用、缺少轮询或线程状态都可能拉长Time to Safepoint。采集时把TTSP和安全点内工作拆开,否则增加GC并行线程无法解决进入安全点之前的延迟。
引用处理、字符串去重和NMT同样有边界。软弱虚引用的处理受可达性与策略影响,字符串去重收益依赖内容分布,NMT不等于进程RSS。所有平均收益必须回到本应用的对象直方图、分配率、CPU和长期保留验证,不能照搬书中或文档的示例百分比。
最小可执行切片
先固定案例与环境:
record G1Case(String sourceCommit, String javaVersion, String flags,
String workloadHash, long heapBytes, String logHash) {}
var baseline = captureBeforeRun();分析器保留阶段树,不只抓总暂停:
var event = parseGcEvent(rawLog, exactJdkVersion);
assertTrue(event.hasSafepointBoundary());
assertEquals(event.pauseNanos(), event.phaseTree().criticalPathNanos());交接合同要求单变量和回滚:
Feature: 《JVM G1源码分析和调优》权威学习地图
Scenario: validate a G1 source and tuning hypothesis
Given jdk8u60 or the explicitly selected source tree and a fixed workload
When 为分配失败、RSet积压、Mixed过晚与安全点过长分别选择章节和最低扰动证据
Then source branches, raw logs, object states, and metrics agree
And adverse effects, version limits, and rollback thresholds are recorded定量判断
Region数量与堆和Region大小相关,大对象需要连续Region,实际边界还包含对齐:
N_{regions}approx rac{HeapSize}{RegionSize},qquad N_{humongous}=leftlceilrac{AlignedObjectSize}{RegionSize} ight ceil停顿关键路径应按阶段和并行失衡解释:
调优同时约束吞吐、暂停和资源:
Throughput=rac{Work}{T_{wall}},qquad GCOverhead=rac{T_{gc}}{T_{wall}},qquad L_{p99}leq Budget并发标记必须赶在空间耗尽前完成,可用预算模型表达风险而非给出万能IHOP:
T_{mark}+T_{margin}<rac{FreeBytes-ReserveBytes}{AllocationRate}这些公式是调查框架,不替代G1内部预测。数字必须注明单位、重复次数、分位数、CPU、NUMA、容器限制、预热和存活率。
本章回顾
本页从第1章 垃圾回收概述覆盖到附录C 阅读JVM需要了解的C++知识,共15个正式节点。最小闭环是建立Region和引用图,以同一源码与日志重放“为分配失败、RSet积压、Mixed过晚与安全点过长分别选择章节和最低扰动证据”,再用135节点覆盖矩阵、源码版本地图、GC阶段依赖图和全书实验清单证明机制、参数收益、副作用、版本与回滚。若仍落入“把G1学习缩成Young、Mixed、Full三张流程图,遗漏分配、Refine、引用、去重、安全点、选型和源码工具”,应回到节点补做状态和失败对照。
练习
问题 1:如何为《JVM G1源码分析和调优》权威学习地图建立源码到日志的最小证据链?
问题 2:为什么“把G1学习缩成Young、Mixed、Full三张流程图,遗漏分配、Refine、引用、去重、安全点、选型和源码工具”会破坏调优结论?
问题 3:迁移到现代JDK时应怎样处理原书jdk8u60结论?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- Collection Set
- 一次暂停中计划回收的一组Region。
- Remembered Set
- 记录其他Region中指向本Region引用位置的反向索引。
- Dirty Card Queue
- 记录待精炼脏卡地址的线程本地或全局队列。
- 停顿预测模型
- 使用近期阶段耗时及偏差估计给定停顿预算能容纳多少回收工作的模型。
- Snapshot At The Beginning
- 并发标记开始时逻辑对象图的快照语义,通过写屏障避免漏标。
- Evacuation Failure
- 暂停疏散时目标空间不足,部分对象无法按计划复制的失败状态。
← 已在全书起点 · 下一页:第1章 垃圾回收概述 →