JVM垃圾回收算法与垃圾收集器详解

垃圾回收算法

标记-清除算法(Mark-Sweep)
该算法分为标记和清除两个阶段。标记阶段遍历所有可达对象,清除阶段回收未被标记的对象。缺点是会产生内存碎片,影响大对象分配效率。

复制算法(Copying)
将内存分为两块,每次只使用一块。垃圾回收时,将存活对象复制到另一块内存,清空原内存块。优点是高效且无碎片,但内存利用率仅50%。

标记-整理算法(Mark-Compact)
标记存活对象后,将所有存活对象向一端移动,清理边界外内存。解决了内存碎片问题,但移动对象成本较高。

分代收集理论
基于对象存活周期差异,将堆分为新生代和老年代。新生代采用复制算法(存活率低),老年代采用标记-清除或标记-整理算法。

垃圾收集器实现

Serial收集器
单线程工作的收集器,全程STW(Stop-The-World)。适用于客户端模式或内存较小的场景,新生代采用复制算法,老年代采用标记-整理算法。

  • 优点:简单高效,无线程交互开销。
  • 缺点:STW时间长。

Parallel Scavenge收集器
新生代并行收集器,采用复制算法,注重吞吐量优化(CPU利用率最大化)。支持自适应调节策略,适合后台运算任务。

  • 参数控制:-XX:MaxGCPauseMillis(最大停顿时间)、-XX:GCTimeRatio(吞吐量权重)。

ParNew收集器
Serial收集器的多线程版本,与CMS配合使用。新生代采用复制算法,默认线程数与CPU核心数相同。

  • 适用场景:需低延迟的CMS组合方案。
  • 参数控制:-XX:ParallelGCThreads(线程数)。

CMS收集器(Concurrent Mark-Sweep)
以最短回收停顿时间为目标的老年代收集器,基于标记-清除算法,过程分为:

  1. 初始标记(STW):标记GC Roots直接关联对象。
  2. 并发标记:遍历对象图。
  3. 重新标记(STW):修正并发标记期间的变动。
  4. 并发清除:清理垃圾对象。
  • 优点:低停顿时间。
  • 缺点:内存碎片敏感,并发阶段占用CPU资源。
关键参数与调优建议
  • 新生代调优
    -Xmn设置新生代大小,过大导致老年代空间不足,过小增加Minor GC频率。
    -XX:SurvivorRatio调整Eden与Survivor区比例。

  • 老年代调优
    CMS需预留空间:-XX:CMSInitiatingOccupancyFraction=70(触发比例)。
    碎片整理:-XX:+UseCMSCompactAtFullCollection(Full GC时整理)。

  • 通用参数
    -XX:+PrintGCDetails启用详细GC日志,-Xloggc:<path>指定日志路径。

典型问题与解决方案

内存碎片导致Full GC
CMS运行期间可能因碎片无法分配大对象,触发Serial Old收集器。解决方案:

  • 增大老年代空间或降低CMSInitiatingOccupancyFraction
  • 改用G1收集器(区域化内存布局)。

并发模式失败(Concurrent Mode Failure)
CMS未完成回收时老年代已满。需提高并发周期启动阈值或增加堆大小。

通过合理选择算法与收集器组合,并针对性调优,可平衡吞吐量、延迟与内存占用,满足不同应用场景需求。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐