垃圾收集器简介

本文详细介绍了HotSpot JVM中各种垃圾回收器的特点与适用场景,包括Serial、ParNew、Parallel Scavenge等新生代收集器,以及Serial Old、Parallel Old、CMS和G1等老年代收集器。此外还探讨了不同回收算法的优势与局限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      上篇文章中提到,Java虚拟机(Hotspot)采取的是分代收集算法(Generational Collection),具体就是将Java堆分为新生代和老年代,由于新生代中的对象在每次垃圾收集的时候都有大量的对象称为”垃圾“(这是一项研究成果Empirical studies have shown that for most object-oriented languages, the Java language included, the vast majority of objects -- as much as 98 percent, depending on your metric for object youth -- die young.),只有少量的对象存活下来,所以适用于使用复制算法收集;对于老年代对象,由于老年代中的对象存活率比较高,所以选用的是标记—清理和标记-整理算法来回收的。

      下图是HotSpot提供的几种垃圾收集器


其中的?现在来看就是G1收集器,收集器之间有连线表示可搭配使用

1. Serial收集器

       特点:单线程,STW(Stop the world)  复制算法  

       它是Client模式下的默认新生代收集器,简单、高效,效率比较高

2. ParNew收集器

       特点: 多线程,STW,复制算法

       它是Server模式下的默认新生代收集器,是Serial的多线程版本,但是在单线程环境下的性能不如Serial。但是可以和老年代的CMS合用

3. Parallel Scavenge收集器

      特点: 多线程并行,STW,复制算法。

     它是一款吞吐量优先的收集器,可用—XX:MaxGCPauseMills控制最大垃圾收集的停顿时间  -XX:GCTimeRatio设置吞吐量大小

4. Serial Old收集器

     特点:单线程,STW,标记-整理算法

     它是Serial收集器的老年代版本,主要用于Client模式,在Server模式下可作为CMS收集器的后备使用,当并发收集器发生Concurrent Mode Failure时使用

5. Parallel Old收集器

     特点:多线程,STW,标记-整理

    它是Parallel Scavenge收集器的老年代版本,一般是和Parallel Scavenge收集器一起使用于注重吞吐量及CPU资源的场合。

6. CMS(Concurrent Mark Sweep)收集器

    特点: 标记-清除,并发收集   低停顿

    它是第一款真正意义上得并发收集器,垃圾收集线程与用户线程基本可以同时工作,实现比较复杂,但是可能出现Concurrent Mode Failure而导致Full GC的发生,与其他

几款老年代收集器相比还会产生内存碎片。

7. G1收集器

    G1是JDK7中正式引入的一款收集器,特点:(http://www.infoq.com/cn/articles/jdk7-garbage-first-collector

  • 并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间,部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。
  • 分代收集:与其他收集器一样,分代概念在G1中依然得以保留。虽然G1可以不需其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。
  • 空间整合:与CMS的“标记-清理”算法不同,G1从整体看来是基于“标记-整理”算法实现的收集器,从局部(两个Region之间)上看是基于“复制”算法实现,无论如何,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。
  • 可预测的停顿:这是G1相对于CMS的另外一大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器特征了。
下面是一些虚拟机启动时参数的含义:

   1) UseSerialGC : 使用Serial + Serial Old收集器组合   Client默认的

  2)  UseParNewGC: 使用ParNew + Serial Old收集器组合

  3) UseConcMarkSweepGC: 使用ParNew + CMS+ Serial Old组合

  4) UseparallelGC: 使用Parallel Scavenge + Serial Old组合   Server模式默认

  5)UseparallelOldGC: 使用Parallel Scavenge + Parallel Old组合


最后说明,没有最好的收集器,即使是最新的G1也有缺点,所以应该根据实际情况选择合适的收集策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值