Java 垃圾回收 (GC) 学习笔记
·
1. 审判标准:谁是垃圾?
-
❌ 引用计数法 (Reference Counting):
-
原理:有引用+1,没引用-1,为0回收。
-
缺陷:无法解决 循环引用 (A ⇋ B) 的问题,会导致内存泄漏。
-
-
✅ 可达性分析 (Reachability Analysis):
-
原理:从 GC Roots(如 main 栈变量、static 变量)开始“顺藤摸瓜”。
-
结果:连不上的(Unreachable)就是垃圾。
-
2. 内存分代:分而治之
JVM 基于“绝大多数对象都是朝生夕死”的规律,将堆内存分为两半:
-
年轻代 (Young Gen):
-
存放新生的对象。
-
特点:存活率极低(垃圾多)。
-
算法:复制算法 (Copying)。只把极少数活着的复制走,效率极高,但浪费一部分空间(Survivor 区)。
-
-
老年代 (Old Gen):
-
存放经历多次 GC 依然活着的对象。
-
特点:存活率高。
-
算法:标记-整理 (Mark-Compact)。把活着的对象往一头推,防止内存碎片。
-
3. 清洁工的进化:GC 收集器
-
Stop-The-World (STW):GC 工作时,必须暂停所有业务线程,造成“卡顿”。
-
G1 (Garbage First):
-
逻辑:把内存切成小方格 (Region)。
-
策略:设置停顿时间目标(如 200ms),优先清理垃圾最多的格子。
-
-
ZGC (The Future):
-
逻辑:并发 (Concurrent) 回收。GC 线程和业务线程一起跑。
-
代价:吞吐量稍降(CPU 被 GC 分走),但换来了 <1ms 的极致低延迟。
-
更多推荐
所有评论(0)