GC的四种回收器详细介绍

GC分为四种:

        1. 串行垃圾回收器(Serial Garbage Collector)

        2. 并行垃圾回收器(Parallel Garbage Collector)

        3. 并发标记扫描垃圾回收器(CMS Garbage Collector)

        4. G1垃圾回收器(G1 Garbage Collector)

详细解释:

        1、串行Serial Collector 单线程回收

        串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。

        通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

        2、并行垃圾回收器

        并行垃圾回收器也叫做 throughput collector 。它是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。相似的是,它也会冻结所有的应用程序线程当执行垃圾回收的时候

        JVM参数配置:-XX:+UseConcMarkSweepGC -XX:+UseParNewGC

        ParNewGC : 通过-XX:+UseParNewGC参数来指定,多线程并行回收的Serial GC版本。

        ParallerGC:Server下默认的GC方式,通过-XX:+UseParallelGC参数指定,并发回收线程数可以用-XX:ParallelGCThreads指定。清除Heap中的部分垃圾对象,并进行部分空间压缩。

        ParallerOldGC:可以通过-XX:UseParallelOldGC参数指定。并发回收线程数用 -XX:ParallelGCThreads来指定。与ParallerGC的不同之处在于Full GC上,前者Full GC是将清空整个Heap中的垃圾对象,清除元数据去已经被卸载的类信息,并进行压缩。而后者是清除Heap中的部分垃圾对象,并进行部分空间压缩。

        3、并发标记扫描垃圾回收器(CMS Collector)

        并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程。当标记的引用对象在tenured区域;在进行垃圾回收的时候,堆内存的数据被并发的改变。相比并行垃圾回收器,CMS(Concurrent Mark Sweoop):并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们可以为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。

        通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

        优点:

        低延迟收集器,几乎没有停顿时间。只有在出示标记和并发标记的时候出短暂停顿。

        缺点:

        CMS中并发意味着多线程强占CPU的资源。

        CMS默认回收线程的公式:(CUP个数+3)/4 .这就意味着如果用户cup个数比较少的,CMS的CPU占用率就很高。显然这种情况以及用硬件打败,现在的机器都是多核处理。

        CMS收集老年代会出现内存碎片化现象

        不会对内存进行任何的压缩和整理,过多的碎片化内存会出现实际内存不足的情况,所以会出现Full GC的情况CMS 提供两个参数来完成Full GC

        ① UseCMSCompactAtFullCollection ,在进行Full GC 的过程中进行内存碎片的整理;

        ② CMSFullGCsBeforeCompaction,每隔多少次不压缩的Full GC ,执行一次压缩Full GC

        出现浮动垃圾:在并发清除过程中,用户进程依然在运行,此时产生的垃圾是在本次清除过程中没办法清除。这部分垃圾被称为浮动垃圾。

        4、G1垃圾回收器

        G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域

        通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

G1和CMS 相比突出的优势

        G1在压缩空间方面有优势

        G1通过将内存空间分成区域(Region)的方式避免内存碎片问题

        Eden、Survivor、Old区域不在固定,在内存使用率上更加灵活

        G1可以设计预期停顿时间(Pause Time)来控制垃圾回收时间避免引用雪崩的现象。

        G1在回收内存后会马上同时做合并空闲内存的工作、CMS默认情况是STW的时候合并内存。

        G1会在Young GC中使用、而CMS在O区中使用

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CMS(Concurrent Mark Sweep)是一种并发的垃圾回收,它是在 JDK 1.5 中引入的,主要用于减少 Full GC 的停顿时间。 CMS 的工作分为以下四个阶段: 1. 初始标记(Initial Mark):首先,停止应用程序的所有线程,然后标记所有与 GC Root 直接关联的对象,并记录下这些对象的信息。 2. 并发标记(Concurrent Mark):在初始标记阶段之后,CMS 开始对堆内存进行并发标记,即标记所有与 GC Root 间接关联的对象。在此期间,应用程序的线程可以继续运行,不需要停顿。 3. 重新标记(Remark):并发标记过程中,由于应用程序的线程仍在运行,可能会产生新的对象被引用,因此需要重新标记一次,以标记所有遗漏的对象。 4. 并发清除(Concurrent Sweep):在重新标记完成后,开始并发地清除所有未被标记的对象。 需要注意的是,CMS 垃圾回收器有一定的缺点: 1. CMS 只能处理老年代的垃圾回收,不能处理年轻代的垃圾回收,因此需要和其他垃圾回收(如 ParNew)配合使用。 2. CMS 垃圾回收在并发执行垃圾回收时,会消耗一定的 CPU 资源,可能会对应用程序的性能产生影响。 3. CMS 垃圾回收使用了“标记-清除”算法,可能会产生内存碎片,进而导致 Full GC 的频繁发生,影响应用程序的性能。 因此,在使用 CMS 垃圾回收时,需要根据应用程序的实际情况进行调优,以达到最佳的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水月清辉

你的鼓励将是我创造的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值