JVM经常使用新生代垃圾收集器

[TOC]算法

Serial垃圾收集器

Serial是单线程垃圾回收器,当须要执行垃圾回收时,程序会暂停一切工做,而后单线程执行垃圾回收.多线程

image-20201103131429173

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

优势

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

缺点:

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

应用场景

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

ParNew垃圾收集器

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

Par是Parallel的缩写,多线程的意思,可是这里的多线程仅仅指垃圾收集多线程并行,并非垃圾收集和程序并行运行.ParNew也须要暂停一切工做,而后多线程并行垃圾收集.性能

image-20201104161310688

由于是多线程执行,因此在多CPU环境下,效率比Serial高,可是在单CPU环境下,由于线程切换,反而性能比较差.spa

应用场景

在Server模式下,ParNew是一个很是重要的收集器,由于除Serial外,目前只有ParNew与CMS收集器配合工做.

image-20201104162415151

参数

  • "-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会根据当前的运行情况动态调整最适合的吞吐量,配合前面两个参数更好.线程

相关文章
相关标签/搜索