垃圾回收器
垃圾回收器使用参数
-XX:+UseSerialGC指定使用新生代串行收集器和老年代串行收集器
-XX:+UseParNewGC指定新生代使用ParNew回收器,老年代使用串行回收器
-XX:+UseParallelGC指定新生代使用ParallelGC回收器,老年代使用串行收集器
-XX:+UseConMarkSweepGC指定新生代使用ParNew回收器,老年代使用CMS
-XX:+UseParllelOldGC指定新生代使用ParallelGC回收器,老年代使用ParallelOld回收器
-XX:+UseConcMarkSweepGC启用CMS回收器
-XX:+UseG1GC使用G1收集器
串行回收器
使用单线程进行垃圾回收,对于并行能力较弱的计算机,串行回收器的专注性和独占性往往有更好的性能表现。在串行收集器进行垃圾回收时,java应用程序的线程都需要暂停,等待垃圾回收的完成。虚拟机运行在client模式下时,它是默认的垃圾回收器
新生代ParNew回收器
它只是简单地将串行回收器多线程化,回收策略,算法以及参数和串行回收器一样。由于并行回收器使用多线程进行垃圾回收,因此并发能力比较强的cpu,他产生的停顿时间较短,而在单CPU或者并发能力较弱的系统中,并行回收器的效果不会比串行回收器好。
ParNew回收器工作时的线程数量可以使用-XX:ParallelGCThreads参数指定。一般,最好与CPU数量相当,避过多的线程数,影响垃圾收集性能,在默认情况下,当CPU数量小于8时,ParallelGCThreads的值等于CPU数量,当CPU数量大于8个时,ParallelGCThreads的值等于3+5/8*CPU_COUNT
新生代ParallelGC回收器
ParallelGC也是多线程、独占式的收集器,但是ParallelGC回收器有一个重要的特点:它更关注系统的吞吐量
ParallelGC提供了两个重要的参数用于控制系统的吞吐量
- -XX:MaxGCPauseMillis设置最大垃圾回收停顿时间。它的值是一个大于0的整数,ParallelGC在工作时会调整java堆大小或者一些其他参数,尽可能地把停顿时间控制在MaxGCPauseMillis内,如果这个值设得很小,为了达到预期停顿时间,虚拟机可能会使用一个较小的堆,这将导致垃圾回收变得很频繁,从而增加了垃圾回收总时间,降低了吞吐量
- -XX:GCTimeRatio设置吞吐量大小,它的值是一个0到100之间的整数。假设GCTimeRatio值为n,那么系统将花费不超过1/(1+n)的时间用于垃圾收集,默认取值99。
注意,这两个参数是一对互相矛盾的参数,需要设置好平衡点。
ParallelGC还支持一种自适应的GC调节策略,使用-XX:UseAdaptivePolicy可以打开自适应GC策略。在这种模式下,新生代的大小,eden和survivor的比例,晋升老年代的对象年龄等参数都会被自动调整,已达到在堆大小,吞吐量和停顿时间之间的平衡点。在手工调优比较困难的场合,可以直接使用这种适应的方式,仅指定虚拟机的最大堆,目标吞吐量和停顿时间,让虚拟机自己完成调优工作。
老年代ParallelOldGC回收器
老年代ParallelOldGC也是一种多线程并发的收集器。和新生代ParallelGC回收器一样,它也是一种关注吞吐量的收集器。它使用标记压缩法。