常用新生代垃圾收集器

常用新生代垃圾收集器

Serial垃圾收集器

Serial是单线程垃圾回收器,当需要执行垃圾回收时,程序会暂停一切工作,然后单线程执行垃圾回收.

图片alt

单线程的好处就是减少上下文切换,减少系统开销.但是这种方式的缺点也很明显,在GC的过程中,会暂停程序执行. 若GC发生不频繁可以选这个. 对于新声代来说,区域比较小,停顿时间短.

优点

  • 简单高效,是Client模式下默认的垃圾收集器;
  • 对于资源受限的环境,比如单核(例如Docker中设置单核),单线程效率较高;
  • 内存小于一两百兆的桌面程序中,交互有限,则有限的STW是可以接受的。

缺点:

  • 垃圾回收速度较慢且回收能力有限,频繁的STW会导致较差的使用体验。

应用场景

  • 是HotSpot在Client模式下默认的新生代垃圾收集器
  • 在用户的桌面应用场景中,可用内存一般不大(几十M至一两百M),可以在较短时间内完成垃圾收集(几十MS至一百多MS),只要不频繁发生,这是可以接受的

ParNew垃圾收集器

ParNew同样用于新生代,是Serial的多线程版本,并且在参数,算法(同样的复制算法)和Serial相同.

Par是Parallel的缩写,多线程的意思,但是这里的多线程仅仅指垃圾收集多线程并行,并不是垃圾收集和程序并行运行.ParNew也需要暂停一切工作,然后多线程并行垃圾收集.

图片alt

因为是多线程执行,所以在多CPU环境下,效率比Serial高,但是在单CPU环境下,因为线程切换,反而性能比较差.

应用场景

在Server模式下,ParNew是一个非常重要的收集器,因为除Serial外,目前只有ParNew与CMS收集器配合工作.

图片alt

参数

  • “-XX:+UseConcMarkSweepGC”:指定使用CMS后,会默认使用ParNew作为新生代收集器;
  • “-XX:+UseParNewGC”:强制指定使用ParNew;
  • “-XX:ParallelGCThreads”:指定垃圾收集的线程数量,ParNew默认开启的收集线程与CPU的数量相同;

Parallel scavenge垃圾收集器

Parallel scavenge是一个新生代垃圾收集器,它是用复制算法的垃圾收集器,又是多线程并行的垃圾收集器,和ParNew类似.吞吐量优先的垃圾收集器,是Java1.8默认的新生代垃圾收集器.

主要特点

Parallel scavenge收集器的目标是达到一个可控的吞吐量,(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))

使用场景

Parallel scavenge收集器的高吞吐量可以最高效率的利用CPU,尽快的完成程序的运算任务,主要适合后台运算而不是太多交互的任务(太多交互的任务,适合用响应时间优先的CMS垃圾收集器)

Parallel scavenge可以精确控制吞吐量,通过两个参数:控制最大垃圾收集停顿时间-XX:MaxGCPauseills,设置吞吐量大小-XX:GCTimeRatio(GCTimeRatio的默认值为99,因此,GC耗时的占比应为1/(1+99)=1%。使用参数的理论效果:GCTimeRatio越大,吞吐量越大,GC的总耗时越小。有可能导致单次MinorGC耗时变长。适用于高运算场景). 它还可以用-XX:+UseAdaptiveSizePolicy参数进行自适应调节(GC Ergonomics),打开后会JVM会根据当前的运行状况动态调整最适合的吞吐量,配合前面两个参数更好.

返回笔记列表
入门小站