1 新生代 Serial、ParNew、Parallel Scavenge (spp)
2 老年代 CMS、Serial Old、Parallel Old (csp)
3 从新生代和老年代的回收器之间进行连线,说明其之间可以
各有千秋
新生代
Serial
其是最基本发展历史最悠久的收集器。俗称为 串行回收器,采用复制算法进行垃圾回收。
特点
用单线程进行垃圾回收的回收器,每次回收,只有一个工作线程。对于并性能力较弱的单 CPU 计算机来说,穿行回收器有比较好的性能表现。
常用参数
使用 -XX: UseSerialGC 参数可以设置新生代使用这个串行回收器
ParNew
为 Serial 的多线程版本,除了使用多线程,其余参数和 Serial 一样,俗称,并行垃圾回收器。采用复制算法。
特点
默认开启线程数量与 CPU 数量相同,在多核机器上。
常用参数
通过 -XX:ParallelGCThreads 来设置线程数量。新生代垃圾回收器 南波湾。使用 XX: UseParNewGC 参数设置新生代使用这个并行回收器。
ParallelGC
使用复制算法回收垃圾,也是多线程。
特点
比较关注系统的吞吐量(吞吐量 = 代码运行时间/(代码运行时间 垃圾收集时间))
常用参数
-XX:MaxGCPauseMillis: 设置最大垃圾回收停顿时间。如果希望减少 GC 停顿的时间,可以把该参数设置小一些,单会导致 GC 频繁,这样会增加 GC 的总时间,也就降低来吞吐量,依实际使用情况来设置即可。
XX:GCTimeRatio
:设置吞吐量大小,它是一个0到100之间的整数,默认情况下他的取值是99
,那么系统将花费不超过1/(1 n)
的时间用于垃圾回收,也就是1/(1 99)=1%
的时间。
另外还可以指定-XX: UseAdaptiveSizePolic
打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。
使用 -XX: UseParallelGC 参数可以设置新生代使用这个并行回收器
老年代
SerialOld
特点
其为 Serial 回收器的老年代回收器版本,同样是个单线程回收器。使用标记-整理算法
用法
1、在 JDK 1.5 及之前版本搭配 Parallel Scavenge 收集器搭配使用
2、作为 CMS 收集器的后备预案,如果 CMS 出现 Concurrent Mode Failure,则用 SerialOld 作为后备收集器。
常用参数
ParallelOldGC
特点
老年代使用 ParallelOldGC 回收器也是一种多线程的回收器,与新生代的 ParallelGC 回收器一样,也是一种关注吞吐量的回收器,使用了 标记压缩算法
常用参数
-XX: UseParallelOldGC 进行设置老年代使用该回收器
-XX: ParallelGCThreads 设置垃圾收集时的线程数量
CMS
特点
不独占, CMS 回收的过程中,程序仍然在不停的运行,清理的同时也会有新的垃圾产生,所以内存要够大!
常用参数
CMS 不会等到应用程序饱和的时候才去回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置: -XX:CMSInitiatingoccupancyFraction 来指定,默认为68,也就是说当老年代的空间使用率达到68%的时候,会执行CMS回收。 如果内存使用率增长的很快,在CMS执行的过程中,已经出现了内存不足的情况,此时CMS回收就会失败,虚拟机将启动老年代串行回收器;SerialOldGC进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。 这个过程GC的停顿时间可能较长,所以 -XX:CMSInitiatingoccupancyFraction 的设置要根据实际的情况。 之前我们在学习算法的时候说过,标记清除法有个缺点就是存在内存碎片的问题,那么CMS有个参数设置-XX: UseCMSCompactAtFullCollecion 可以使CMS回收完成之后进行一次碎片整理。 XX:CMSFullGCsBeforeCompaction 参数可以设置进行多少次CMS回收之后,对内存进行一次压缩。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!