图解JVM - 11.垃圾回收概述及算法
创作时间:
作者:
@小白创作中心
图解JVM - 11.垃圾回收概述及算法
引用
CSDN
1.
https://blog.csdn.net/Anarkh_Lee/article/details/145896696
1. 垃圾回收概述
1.1 什么是垃圾?
在JVM语境中,"垃圾"指失去所有引用的堆内存对象。判定标准包括:
- 不可达对象(通过GC Roots不可达)
- 循环引用孤岛(彼此引用但整体不可达)
- 特殊引用(软/弱/虚引用)的次级对象
1.2 为什么需要GC?
三大核心原因:
- 内存安全:防止野指针和非法内存访问
- 资源管理:自动回收不再使用的对象
- 性能优化:通过内存整理提升访问效率
1.3 早期垃圾回收
技术演进路线:
1.4 Java垃圾回收机制
核心架构:
关键特性:
- 自动内存管理:开发人员无需显式释放
- 分代假设:弱分代假说/强分代假说
- STW机制:安全点(Safepoint)控制
2. 垃圾回收相关算法
2.1 标记阶段:引用计数算法
实现原理:
致命缺陷演示:
循环引用问题:即使对象间互相引用,但因外部引用断开,实际已成为垃圾却无法被识别
2.2 标记阶段:可达性分析算法
核心原理:
GC Roots类型:
- 虚拟机栈中的局部变量
- 方法区静态属性引用
- 方法区常量引用
- 本地方法栈JNI引用
- 同步锁持有对象
2.3 对象的finalization机制
生存判定流程:
重要特性:
finalize()
方法只会被JVM调用一次,且不保证执行顺序
2.4 MAT与JProfiler的GC Roots溯源
实战操作流程:
JProfiler溯源示例:
2.5 清除阶段:标记-清除算法
执行过程详解:
- 标记阶段:通过可达性分析标记所有存活对象
- 清除阶段:线性遍历堆内存,回收未被标记的对象块
缺陷分析:
技术痛点:
- 两次全堆扫描(标记和清除)效率低
- 清除后内存空间不连续,导致分配大对象时触发Full GC
2.6 清除阶段:复制算法
核心机制:
- 内存划分:将可用内存分为两个等大的From和To区域
- 存活对象迁移:将From区存活对象复制到To区,并保持内存紧凑
优劣对比表:
优势 | 劣势 |
---|---|
无内存碎片 | 内存利用率仅50% |
高速分配(指针碰撞) | 对象存活率高时效率骤降 |
适合年轻代 | 需要额外空间处理引用更新 |
实战应用:
2.7 清除阶段:标记-压缩算法
指针碰撞原理:
适用场景:
- 老年代垃圾回收(配合CMS或G1使用)
- 需要长期存活的大对象管理
性能影响:
2.8 算法对比总结
2.9 分代收集算法
内存代际划分:
回收策略矩阵:
代际 | 算法 | 触发条件 | 耗时 |
---|---|---|---|
年轻代 | 复制算法 | Eden满 | 毫秒级 |
老年代 | 标记-压缩 | 空间不足 | 秒级 |
对象晋升流程:
2.10 增量收集与分区算法
增量收集原理:
分区算法优势:
3. 垃圾回收常见问题与解决方案
3.1 内存泄漏问题
典型案例:
- 线程局部变量泄漏:ThreadLocal使用后未remove
- 缓存失控增长:Guava Cache未设置过期策略
- JNI引用未释放:本地方法分配的内存未回收
3.2 GC性能调优
调优决策树:
参数配置矩阵:
场景 | 推荐参数 | 作用域 |
---|---|---|
Web应用 | -XX:+UseG1GC | 全堆 |
大数据计算 | -XX:+UseParallelGC | 年轻代 |
低延迟交易 | -XX:+UseZGC | JDK11+ |
3.3 Full GC频繁触发
诊断流程图:
常见诱因:
- 老年代空间分配担保失败
- 元空间/metadata区溢出
- System.gc()主动调用
4. 高频面试问题与解答
Q1:引用计数算法与可达性分析的本质区别?
答案要点:
Q2:对象自救的可行性及限制?
技术解析:
关键限制:
- finalize()执行顺序不确定
- 自救仅能执行一次
- 不推荐生产环境使用
Q3:标记-清除算法导致的内存碎片如何影响系统?
影响路径:
解决方案对比:
方案 | 原理 | 副作用 |
---|---|---|
标记-压缩 | 内存滑动整理 | STW时间增加 |
空闲列表 | 维护可用块记录 | 分配效率下降 |
Q4:G1收集器如何实现可预测停顿?
核心机制:
技术亮点:
- 将堆划分为2048个Region(默认)
- 基于回收效益的优先级排序
- 使用Remembered Set处理跨代引用
Q5:如何排查OOM问题?
实战检查清单:
关键命令:
# 生成dump文件
jmap -dump:format=b,file=heap.hprof <pid>
# 查看对象直方图
jmap -histo <pid>
Q6:ZGC的核心创新点?
技术突破:
适用场景:
- 要求低延迟的金融交易系统
- 大内存云原生应用
- JDK15+生产环境
热门推荐
乳山生蚝怎么吃,8种简单乳山生蚝做法推荐
DHA含量高的食物排名公开,补充DHA好的食物都在这
AI原创检测工具:揭秘防抄袭神器,学术界新宠
如何优化服务器的网络配置,以降低延迟和提升访问速度?
荨麻疹需要查过敏源不
一周台湾旅游预算及行程规划建议
掌握选择指南,找到最适合自己的笔记本电脑秘诀
生活中的逻辑学:从决策到沟通的思维指南
二次元中的INFJ角色:情感敏感与责任担当的完美结合
儿童皮肤科需要做什么检查
新股票如何有效筛选?这种有效筛选的标准是什么?
决战来了!郑钦文冲击8强:对手+比赛时间确定,冲800万冠军奖金
争议不断的“预制菜”企业要想做大做强,必须这样干
中国电信首个高质量数据集智能标注基地落地成都
蜂胶的相似成分比较与应用
银行存款有100万,到底能不能“躺平”?答案来了
尤里安德罗波夫的生平——执政15个月,他为苏联做了什么
神秘股东金斌逐利华为概念,四倍牛股常山北明背后赢家
3A新作《克苏鲁:宇宙深渊》公布 虚幻5引擎、2026年发售
奇门遁甲实战案例详解:从求财到出行全方位解析
夏天洗冷水澡降温效果更好?这些传言别再信了
克林霉素属于哪类抗生素?了解克林霉素的药理作用和应用
全面解析优点的多重价值:从个人发展到职场成功的全方位指南
考研院校专业排名查询攻略:从官方渠道到第三方评估机构
适合配音的英语动漫片段(适合配音的英语动漫片段素材)
英语配音视频单人:简单背后的技巧与挑战
酒后的刘禹锡写下一首名作,第五句最经典
中国只排第7?美媒公布2025全球空中力量排名,直接无视六代机!
硅碳负极:锂电池续航革命的新星,如何突破能量天花板?
特殊符号怎么打出来