常见的垃圾回收算法?

JVM 面试题发布于

一、判断对象是否可回收

  • 引用计数法:对象被引用计数 +1,为 0 则回收。无法解决循环引用。
  • 可达性分析:从 GC Roots 出发,不可达的对象可回收。GC Roots 包括栈中引用、静态变量、常量、JNI 引用。

二、回收算法

  • 标记-清除:标记存活对象,清除垃圾。缺点:内存碎片。
  • 标记-复制:内存分两块,存活对象复制到另一块,清空原块。缺点:内存利用率低。
  • 标记-整理:标记后把存活对象移到一端,清除边界外。无碎片,但移动开销大。
  • 分代收集:新生代用复制算法(对象朝生夕灭),老年代用标记-清除或标记-整理。

三、垃圾收集器

  • Serial / ParNew / Parallel Scavenge(新生代,复制)
  • CMS / G1 / ZGC(老年代或整堆)