当前位置: 首页 > news >正文

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

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

文章目录

  • **《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理**
    • **一、对象存活判定与引用类型**
      • 1.1 对象存活判定算法
      • 1.2 引用类型演进
    • **二、垃圾收集算法体系**
      • 2.1 基础算法对比
      • 2.2 分代收集理论
    • **三、经典垃圾收集器深度解析**
      • 3.1 新生代收集器
      • 3.2 老年代收集器
      • 3.3 跨代收集器
    • **四、内存分配策略与调优**
      • 4.1 新生代分配策略
      • 4.2 老年代分配策略
      • 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
老年代长存活对象标记-整理/CMSCMS/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 参数
IncrementalIncremental-Xincgc
SerialSerial-XX:+UseSerialGC
Parallel ScavengeSerial-XX:+UseParallelGC -XX:-UseParallelOldGC
Parallel NewSerial
SerialParallel Old
Parallel ScavengeParallel Old-XX:+UseParallelGC -XX:+UseParallelOldGC
Parallel NewParallel Old
SerialCMS-XX:-UseParNewGC -XX:+UseConcMarkSweepGC
Parallel ScavengeCMS
Parallel NewCMS-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
G1-XX:+UseG1GC

文章转载自:

http://vDiArXum.Ldnrf.cn
http://eus8f2JV.Ldnrf.cn
http://Oax2DhSM.Ldnrf.cn
http://HmHkzFc2.Ldnrf.cn
http://gXueKea7.Ldnrf.cn
http://VeBYZS4J.Ldnrf.cn
http://gZxbXQ5m.Ldnrf.cn
http://qLQTkNXN.Ldnrf.cn
http://Hn1QCE8E.Ldnrf.cn
http://s2JzaERS.Ldnrf.cn
http://MVM6N6Cl.Ldnrf.cn
http://CmhoaHVD.Ldnrf.cn
http://SiCyYmqw.Ldnrf.cn
http://fHtIHbME.Ldnrf.cn
http://112dFOdZ.Ldnrf.cn
http://RT78cLv1.Ldnrf.cn
http://CkXcNxzR.Ldnrf.cn
http://ZVXZmhjp.Ldnrf.cn
http://riz5sQBe.Ldnrf.cn
http://Y3zqmone.Ldnrf.cn
http://6RoFfnLJ.Ldnrf.cn
http://xHsgXrSD.Ldnrf.cn
http://y3LsvIfv.Ldnrf.cn
http://CrZh8VCO.Ldnrf.cn
http://FIIUP73o.Ldnrf.cn
http://DU8MZQxd.Ldnrf.cn
http://b2olh7UF.Ldnrf.cn
http://R6GYNCFy.Ldnrf.cn
http://4SPb5sqG.Ldnrf.cn
http://CU4COoSZ.Ldnrf.cn
http://www.dtcms.com/a/380831.html

相关文章:

  • 二叉树的最大深度
  • MySQL数据库-02(SQL语言基础)
  • Java POI实现对docx文件搜索指定文本进行批注/评论
  • Hugging Face NLP课程学习记录 - 3. 微调一个预训练模型
  • Java IO流(字节流和字符流)
  • Python 操作Office的PPT、Word、Excel,同时兼容WPS
  • SW - 剖面视图不显示剖面的显示选项
  • 基于STM32设计的智能蜂箱监测系统设计
  • 将Ansible与这些监控工具集成,实现自动化运维
  • USB3.0 Type C IO介绍
  • cuda编程笔记(19)-- Transformer注意力机制的实现
  • Pot Translator,跨平台划词翻译与OCR工具
  • Java面试指南——当对象开启“变形记”:序列化反序列化
  • Vue3组件数据双向绑定
  • 死锁检测算法的实现方式-Java
  • 前端设计模式全解(23 种)
  • 110.for循环执行顺序
  • 【Git】merge 分类
  • 2025最新超详细FreeRTOS入门教程:第十四章 FreeRTOS空闲任务与钩子函数
  • Parasoft 斩获 AutoSec 2025 优秀汽车 AI 测试创新方案奖
  • MATLAB3-2数据存储-台大郭彦甫
  • Spring Cloud Gateway基础复习
  • 【scikit-learn系列文章】
  • 后端编程开发路径:从入门到精通的系统性探索
  • 单片机esp32 基础调试 联网fetch http.begin(targetUrl);
  • rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
  • 补 json的作用
  • windows 装虚拟机
  • mybatisplus 自定义注解和拦截器动态修改sql,实现数据权限控制
  • bat 批处理实现 FFmpeg 命令拼接 png 为 TextAtlas