《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
文章目录
- **《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理**
-
- **一、对象存活判定与引用类型**
-
- [1.1 对象存活判定算法](#1.1 对象存活判定算法)
- [1.2 引用类型演进](#1.2 引用类型演进)
- **二、垃圾收集算法体系**
-
- [2.1 基础算法对比](#2.1 基础算法对比)
- [2.2 分代收集理论](#2.2 分代收集理论)
- **三、经典垃圾收集器深度解析**
-
- [3.1 新生代收集器](#3.1 新生代收集器)
- [3.2 老年代收集器](#3.2 老年代收集器)
- [3.3 跨代收集器](#3.3 跨代收集器)
- **四、内存分配策略与调优**
-
- [4.1 新生代分配策略](#4.1 新生代分配策略)
- [4.2 老年代分配策略](#4.2 老年代分配策略)
- [4.3 调优参数示例](#4.3 调优参数示例)
一、对象存活判定与引用类型
1.1 对象存活判定算法
Java虚拟机通过可达性分析(Reachability Analysis)机制判断对象是否存活:
- GC Roots:包括虚拟机栈(局部变量表)、方法区(类静态属性)、本地方法栈(JNI引用)等根节点
- 三色标记法:通过白(未访问)、灰(已访问子对象)、黑(已访问)三色状态实现并发标记
- 安全点机制 :通过
Stop-The-World
确保枚举根节点时对象引用关系稳定
1.2 引用类型演进
JDK 1.2后引入的四种引用类型:
引用类型 | 触发条件 | 典型应用场景 |
---|---|---|
强引用 | 默认引用,永不回收 | 核心业务对象 |
软引用 | 内存不足时回收 | 图片缓存、大对象缓冲 |
弱引用 | GC周期必然回收 | 实现WeakHashMap |
虚引用 | 跟踪回收状态 | 内存泄漏监控 |
二、垃圾收集算法体系
2.1 基础算法对比
(1)标记-清除算法
- 原理:标记所有存活对象后清除未标记区域
- 缺陷:产生内存碎片,导致大对象分配失败
- 改进:配合压缩整理阶段使用

(2)标记-复制算法
- 实现:将内存分为两块,仅使用其中一块(如Eden区)
- 优化 :Survivor区采用
From/To
双区交替复制 - 参数 :
-XX:SurvivorRatio
调整Eden与Survivor比例

(3)标记-整理算法
- 流程:标记存活对象后向内存一端移动
- 优势:消除内存碎片,适合老年代
- 代价:移动对象导致性能开销

2.2 分代收集理论
现代JVM采用分代式垃圾收集框架:
内存区域 | 对象特征 | 收集算法 | 典型收集器 |
---|---|---|---|
新生代 | 短生命周期 | 复制算法 | Parallel Scavenge |
老年代 | 长存活对象 | 标记-整理/CMS | CMS/G1 |
方法区 | 类元信息 | 引用计数+分代 | ZGC |
三、经典垃圾收集器深度解析
3.1 新生代收集器
(1)Serial收集器
- 单线程串行执行
- 适合客户端模式(
-XX:+UseSerialGC
) - 停顿时间与堆大小成正比

(2)ParNew收集器
-
Serial的多线程版本
-
与CMS配合使用(
-XX:+UseConcMarkSweepGC
) -
线程数通过
-XX:ParallelGCThreads
配置
3.2 老年代收集器
(1)CMS收集器
-
三阶段流程:
- 初始标记(STW)
- 并发标记
- 重新标记(STW)
- 并发清除
-
缺陷:
- 浮动垃圾导致Full GC
- 内存碎片需触发
-XX:+UseCMSCompactAtFullCollection
(2)G1收集器
-
核心思想:
- 将堆划分为多个Region(1MB~32MB)
- 通过Remembered Set追踪跨Region引用
-
优势:
- 可预测的停顿时间模型
- 混合回收(Young GC + 部分old GC)
3.3 跨代收集器
在JDK 11当中,加入了实验性质的ZGC。它的回收耗时平均不到2毫秒。它是一款低停顿高并发的收集器。
与CMS中的ParNew和G1类似,ZGC也采用标记-复制算法,不过ZGC对该算法做了重大改进:ZGC在标记、转移和重定位阶段几乎都是并发的,这是ZGC实现停顿时间小于10ms目标的最关键原因。
ZGC
-
关键技术:
- 染色指针(Colored Pointer)
- 读屏障(Read Barrier)
- 并发压缩(Concurrent Compaction)
-
特性:
- 亚毫秒级停顿
- 支持TB级堆内存
四、内存分配策略与调优
4.1 新生代分配策略
- Eden优先原则:默认在Eden区分配
- 大对象直入老年代 :
-XX:PretenureSizeThreshold
(默认0) - 动态年龄判定 :
-XX:MaxTenuringThreshold
(默认15)
4.2 老年代分配策略
- 晋升阈值:Survivor区对象经历N次GC后晋升
- 空间分配担保 :
-XX:-HandlePromotionFailure
控制担保机制
4.3 调优参数示例
并行收集器配置 -XX:+UseParallelGC -XX:ParallelGCThreads=8
G1收集器配置 -XX:+UseG1GC -XX:MaxGCPauseMillis=200
ZGC收集器配置 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
设置垃圾收集器(组合)的参数如下:
新生代 | 老年代 | JVM 参数 |
---|---|---|
Incremental | Incremental | -Xincgc |
Serial | Serial | -XX:+UseSerialGC |
Parallel Scavenge | Serial | -XX:+UseParallelGC -XX:-UseParallelOldGC |
Parallel New | Serial | |
Serial | Parallel Old | |
Parallel Scavenge | Parallel Old | -XX:+UseParallelGC -XX:+UseParallelOldGC |
Parallel New | Parallel Old | |
Serial | CMS | -XX:-UseParNewGC -XX:+UseConcMarkSweepGC |
Parallel Scavenge | CMS | |
Parallel New | CMS | -XX:+UseParNewGC -XX:+UseConcMarkSweepGC |
G1 | -XX:+UseG1GC |