美文网首页
2.垃圾收集器与内存分配策略(2)

2.垃圾收集器与内存分配策略(2)

作者: 农民工进城 | 来源:发表于2021-03-08 18:49 被阅读0次

本章要点

  1. 垃圾回收器
  2. GC 调优策略

1.垃圾回收器

1.1 年轻代垃圾回收器
  • Serial收集器:主要针对针对新生代,什么都不配置的话JVM默认的收集器,采用复制算法
  • ParNew收集器:主要 针对新生代, Serial的多线程版本。
  • Parallel Scanvenge: 主要针对新生代,主要用在服务器上,这种垃圾收集器也是采用复制算法,但是关注CPU吞吐量,强调CPU运行垃圾回收的时间和CPU执行用户代码的时间的比例。
image.png
1.2 年老代垃圾回收器
  • Serial Old收集器:主要针对老年代,采用标记清理和标记压缩算法,单线程版本
  • Parallel Old收集器:主要针对老年代,多线程版本。
  • CMS(Concurrent Mark Sweep):大名鼎鼎的并行标记清理收集器,主要针对老年代,多线程,主要关注停顿时间,这个在嵌入式设备上非常有名,因为用户对于停顿时间很敏感。

CMS的原理是三次标记一次清除。
第一次标记先找到应用中所有的GC root,这次标记需要暂停用户线程。但是时间非常非常短。
第二次标记不需要暂停用户线程,根据第一次标记的结果去寻找不可达对象。
第三次标记也需要暂停用户线程,因为在第二次标记的过程中,GC root可能发生了变化,这个时候就要在把变化的重新标记一下。

三次标记完成之后就会执行清理过程。

CMS 和 G1 回收器的响应速度快,Parallel Scavenge 回收器的吞吐量高。

2.GC 调优策略

2.1 降低 Minor GC 频率

增大新生代空间来降低 Minor GC 的频率。
单次 Minor GC 时间=T1(扫描新生代)和 T2(复制存活对象)

扩容后:

  • 由于新生代内存变大,所以扫描对象变多,所以Minor GC 时增加了 T1
  • 但对于新生代中的对象来说,大多数朝生夕死,此时大部分对象已经被回收,所以省去了 T2 的时间
    而通常在虚拟机中,复制对象的成本要远高于扫描成本;所以可以降低Minor GC频率。

如果在堆内存中存在较多的长期存活的对象,此时增加年轻代空间,反而会增加 Minor GC 的时间。如果堆中的短期对象很多,那么扩容新生代,单次 Minor GC 时间不会显著增加。因此,单次 Minor GC 时间更多取决于 GC 后存活对象的数量,而非 Eden 区的大小。

2.2. 降低 Full GC 的频率
  • 减少创建大对象
  • 增大堆内存空间
  • 选择合适的 GC 回收器

相关文章

网友评论

      本文标题:2.垃圾收集器与内存分配策略(2)

      本文链接:https://www.haomeiwen.com/subject/ojxofltx.html