[TOC]
Serial垃圾收集器
Serial是单线程垃圾回收器,当须要执行垃圾回收时,程序会暂停所有工作,而后单线程执行垃圾回收.
单线程的益处就是缩小上下文切换,缩小零碎开销.然而这种形式的毛病也很显著,在GC的过程中,会暂停程序执行. 若GC产生不频繁能够选这个. 对于新声代来说,区域比拟小,进展工夫短.
长处
- 简略高效,是Client模式下默认的垃圾收集器;
- 对于资源受限的环境,比方单核(例如Docker中设置单核),单线程效率较高;
- 内存小于一两百兆的桌面程序中,交互无限,则无限的STW是能够承受的。
毛病:
- 垃圾回收速度较慢且回收能力无限,频繁的STW会导致较差的应用体验。
利用场景
- 是HotSpot在Client模式下默认的新生代垃圾收集器
- 在用户的桌面利用场景中,可用内存个别不大(几十M至一两百M),能够在较短时间内实现垃圾收集(几十MS至一百多MS),只有不频繁产生,这是能够承受的
ParNew垃圾收集器
ParNew同样用于新生代,是Serial的多线程版本,并且在参数,算法(同样的复制算法)和Serial雷同.Par是Parallel的缩写,多线程的意思,然而这里的多线程仅仅指垃圾收集多线程并行,并不是垃圾收集和程序并行运行.ParNew也须要暂停所有工作,而后多线程并行垃圾收集.
因为是多线程执行,所以在多CPU环境下,效率比Serial
高,然而在单CPU环境下,因为线程切换,反而性能比拟差.
利用场景
在Server模式下,ParNew是一个十分重要的收集器,因为除Serial外,目前只有ParNew与CMS收集器配合工作.
参数
- "-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会依据以后的运行状况动静调整最适宜的吞吐量,配合后面两个参数更好.