《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理

《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理

文章目录

一、对象存活判定与引用类型

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收集器

  • 三阶段流程

    1. 初始标记(STW)
    2. 并发标记
    3. 重新标记(STW)
    4. 并发清除
  • 缺陷

    • 浮动垃圾导致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
相关推荐
记得开心一点嘛2 小时前
手搓Springboot
java·spring boot·spring
技术猿188702783512 小时前
PHP 与 WebAssembly 的 “天然隔阂”
开发语言·php·wasm
薄荷撞~可乐2 小时前
C#Task(Api)应用
开发语言·c#
老华带你飞2 小时前
租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·租房系统管理平台
独行soc2 小时前
2025年渗透测试面试题总结-66(题目+回答)
java·网络·python·安全·web安全·adb·渗透测试
脑子慢且灵3 小时前
[JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
java·后端·servlet·tomcat·intellij-idea·web
华仔啊4 小时前
SpringBoot 中 6 种数据脱敏方案,第 5 种太强了,支持深度递归!
java·后端
another heaven4 小时前
【Qt VS2022调试时无法查看QString等Qt变量信息】解决方法
开发语言·qt
A黄俊辉A4 小时前
axios+ts封装
开发语言·前端·javascript