垃圾回收器介绍

2023-11-14 23:13:18 浏览数 (1)

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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞