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 的极致低延迟。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐