《深入理解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
相关推荐
艾菜籽9 小时前
JVM中的垃圾回收机制
java·jvm
席万里9 小时前
使用Go做一个分布式短链系统
开发语言·分布式·golang
做运维的阿瑞9 小时前
Python核心架构深度解析:从解释器原理到GIL机制全面剖析
开发语言·python·架构·系统架构
敲代码的嘎仔10 小时前
JavaWeb零基础学习Day1——HTML&CSS
java·开发语言·前端·css·学习·html·学习方法
1nullptr11 小时前
Lua上值与闭包
开发语言·lua
Terio_my15 小时前
Java bean 数据校验
java·开发语言·python
Tony Bai15 小时前
【Go开发者的数据库设计之道】07 诊断篇:SQL 性能诊断与问题排查
开发语言·数据库·后端·sql·golang
超级大只老咪16 小时前
何为“类”?(Java基础语法)
java·开发语言·前端
我笑了OvO16 小时前
C++类和对象(1)
java·开发语言·c++·类和对象