java常见的垃圾收集器

1、Serial GC(串行收集器)

“Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入“Stop-The-World”状态。

串行收集器的执行流程如下所示:

2、ParNew GC

这个收集器只针对新生代进行并发回收,老年代依然使用串行回收。它实际是 Serial GC 的多线程版本。

如果要使用这种收集器,可以在启动参数中配置:-XX:+UseParNewGC

ParNew收集器的流程如下图所示:

3、Parallel收集器

依然是并行收集器,但这种收集器有两种配置,一种类似于ParNEW:新生代使用并行回收、老年代使用串行回收。它与ParNew的不同在于它在设计目标上更重视吞吐量,可以认为在相同的条件下它比ParNew更优。

如果要使用这种收集器,可以在启动参数中配置:-XX:+UseParallelGC

Parallel收集器的流程和ParNew的流程是一致的:

4、CMS收集器

Concurrent Mark Sweep并发标记清除,注意这里注意两个词:并发、标记清除。并发表示它可以与应用程序并发执行、交替执行;标记清除表示这种收集器不是使用的是标记整理算法,这和前面介绍的串行收集器和并发收集器有所不同。

设计目标是尽量减少停顿时间,这一点对于 Web 等反应时间敏感的应用非常重要,一直到今天,仍然有很多系统使用 CMS GC。但是,CMS 采用的标记 - 清除算法,存在着内存碎片化问题,所以难以避免在长时间运行等情况下发生 full GC,导致恶劣的停顿。另外,既然强调了并发(Concurrent),CMS 会占用更多 CPU 资源,并和用户线程争抢。

要执行这种垃圾收集器可以在启动参数中配置:-XX:+UseConcMarkSweepGC
CMS收集器的流程如下图所示:

从上图可以看到标记过程分三步:初始标记、并发标记、重新标记,并发标记是最主要的标记过程,而这个过程是并发执行的,可以与应用程序线程同时进行,初始标记和重新标记虽然不能和应用程序并发执行,但这两个过程标记速度快,时间短,所以对应用程序不会产生太大的影响。最后并发清除的过程,也是和应用程序同时进行的,避免了应用程序的停顿。

5、G1收集器

这是一种兼顾吞吐量和停顿时间的 GC 实现,是 Oracle JDK 9 以后的默认 GC 选项。

不同于其他的回收器、G1将堆空间划分成了互相独立的区块。每块区域既有可能属于老年代、也有可能是新生代,并且每类区域空间可以是不连续的(对比CMS的老年代和新生代都必须是连续的)。这种将老年代区划分成多块的理念源于:当并发后台线程寻找可回收的对象时、有些区块包含可回收的对象要比其他区块多很多。虽然在清理这些区块时G1仍然需要暂停应用线程、但可以用相对较少的时间优先回收包含垃圾最多区块。这也是为什么G1命名为Garbage First的原因:第一时间处理垃圾最多的区块。

要使用G1回收器需要在启动是配置参数:-XX:+UseG1GC
G1相对CMS回收器来说优点在于:

1、因为划分了很多区块,回收时减小了内存碎片的产生;

2、G1适用于新生代和老年代,而CMS只适用于老年代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值