JavaGC介绍

255 阅读2分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

一、采集算法

1. 标记-清除

  1. 优点:不需要移动对象的位置。
  2. 缺点:遍历所有对象,效率较低。不涉及移动对象,导致内存碎片空间较多。
  3. 主流程:① 标记对象是否死亡。② 清理死亡对象。

2. 标记-整理

  1. 优点:不会产生大量碎片空间。
  2. 缺点:若存活对象过多,复制执行次数较多,算法效率降低。
  3. 主流程:① 标记对象是否死亡。② 未死亡对象整理至另一空间,清理剩余对象。

3. 复制

  1. 优点:不产生内存碎片。
  2. 缺点:空间换时间,实例可用内存只有原来的一半。
  3. 主流程:内存均分成两部分,一半区域满之后,整理复制到另一半区域,再清理原区域。

4. 分代收集

略,参考 G1。

二、GC实现

1. Serial | 串行

  1. 效率低,可能产生较长的停顿。

2. Parallel | 并行

  1. 缺点:清理不彻底,降低系统吞吐量和性能。

3. CMS

  1. 并发 + 标记清除。
  2. 初始标记(STW)、并发标记、重新标记(STW)、并发清除。
  3. 目标:尽可能降低停顿时间。
  4. 缺点:清理不彻底,存在碎片空间,不便于再分配大对象。

4. G1

-XX:+UseG1GC 开启

  1. 并发 + 复制 + 分代收集。
  2. 目标:针对具有大量内存的多核服务器;处理内存中大量的碎片空间;通过跟踪有关先前应用程序行为和垃圾收集暂停的信息来构建相关成本模型,从而实现可预测性(不超过几百毫秒的可预测的暂停时间目标,避免长时间的垃圾收集暂停)。
  3. 将堆划分为年轻代和老年代,主要集中力量在年轻代的回收。
  4. 新生代(Eden)经过多次 YoungGC 后,若达到阈值,对象会被复制至老年代空间。
  5. 老年代空间占用达到阈值后,触发Full GC。