JVM垃圾回收:算法与收集器全解析,设计模式(C++)详解——状态模式(State)(2)。
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)
以最短回收停顿时间为目标的老年代收集器,基于标记-清除算法,过程分为:
- 初始标记(STW):标记GC Roots直接关联对象。
- 并发标记:遍历对象图。
- 重新标记(STW):修正并发标记期间的变动。
- 并发清除:清理垃圾对象。
- 优点:低停顿时间。
- 缺点:内存碎片敏感,并发阶段占用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未完成回收时老年代已满。需提高并发周期启动阈值或增加堆大小。
通过合理选择算法与收集器组合,并针对性调优,可平衡吞吐量、延迟与内存占用,满足不同应用场景需求。
更多推荐


所有评论(0)