垃圾回收算法详解

概述

垃圾回收是JVM自动管理内存的机制,主要有四种算法。

核心算法

标记-清除(Mark-Sweep)

  • 分两阶段:标记可达对象、清除未标记对象
  • 优点:算法简单
  • 缺点:产生内存碎片

复制算法(Copying)

  • 内存分为两个等大小区域,存活对象复制到另一个区域
  • 优点:无内存碎片
  • 缺点:浪费一半内存,适用于新生代

标记-整理(Mark-Compact)

  • 标记可达对象,将存活对象压缩到一端
  • 优点:无碎片,内存利用率高
  • 缺点:算法复杂,需要移动对象

分代收集(Generational Collection)

  • 新 代用复制算法,老年代用标记-整理算法
  • 基于假设:新生对象易死,老年对象难死

常见问题

Q: 为什么新生代用复制,老年代用标记-整理?
A: 新生代对象存活率低适合复制,老年代存活率高不浪费空间

Q: 什么是GC停顿?
A: GC运行时JVM暂停所有用户线程(Stop The World)

Q: 如何减少GC停顿时间?
A: 使用低延迟收集器如G1GC、ZGC