垃圾收集器介绍

原创 2016年06月01日 14:02:43

1.Serial收集器

Serial是最基本历史最悠久的收集器,曾经(在JDK1.3.1之前)是虚拟机新生代收集的唯一选择。它是单线程收集器。单线程的含义是指他只会使用一个CPU或者一条收集线程来完成收集工作,而且在它进行收集的时候,必须暂停其他所有的工作线程。虽说Serial收集器对于商业的大型虚拟机不适用,但是确实Client模式下默认的新生代收集器。因为它简单高效。同时桌面端的新生代不会太大,回收也比较快,停顿时间一般很小,在可接受范围之内。

2.ParNew收集器

它是Serial收集器的多线程版本,它是多线程收集垃圾的。除了Serial收集器外,目前只有它可以和CMS收集器配合工作。当CPU非常多时,它对于GC时系统资源的有效利用还是很好的。它也是暂停所有的应用线程来进行垃圾回收。Serial收集器和 ParNew收集器都是带有整理Compact过程的收集器,采用指针碰撞的方法分配对象内存。

3.Parallel Scavenge收集器

这是一个新生代收集器,使用复制算法,并行的多线程收集器。CMS等收集器关注与尽可能地缩短垃圾收集时用户线程的停顿时间;而Parallel Scavenge收集器致力于达到一个可控制的吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)

4.Serial Old收集器

Serial收集器的老年代版本,使用标记-整理算法,也是给Client模式下的虚拟机使用。现在主要用途是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。

5.Parallel Scavenge收集器收集器的老年代版本,使用多线程和标记-整理的算法。在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge和Parallel Old收集器。

6.CMS收集器
CMS收集器关注与尽可能地缩短垃圾收集时用户线程的停顿时间。基于标记-清除的算法,运行过程分为4个过程,初始标记和重新标记仍然会停掉所有工作线程。并发收集、低停顿的收集器

  • 初始标记:标记GC Roots能直接关联到的对象,速度很快
    并发标记:进行GC Roots Tracing的过程
    重新标记:修正并发标记期间因用户程序继续运作而导致标记发生变动的那一部分对象的标记记录,停顿时间比初始标记长,远比并发标记短。
    并发清除:并发标记和并发清除都是可以和用户线程一起工作。CMS有以下三个缺点:

  • 对CPU资源敏感。面向并发设计的程序一般都对CPU资源敏感。在并发阶段,随便它不会导致用户线程停顿,但是会占用一部分CPU资源,导致应用程序变慢,总吞吐量降低。

  • 无法处理浮动垃圾。可能出现”Concurrent Mode Failure“失败导致另外一次Full GC。由于CMS并发清理阶段用户线程还在运行,伴随程序运行自然产生了新的垃圾,CMS无法在当次收集中处理掉他们,只能留作下一次GC清理。这部分垃圾就是浮动垃圾。由于在垃圾收集阶段用户线程还需要运行,因此需要预留足够的内存给用户线程使用。所以CMS不能像其他老年代收集器一样等老年代几乎填满再进行收集。要是CMS在运行时预留的内存(在JDK1.6中,CMS启动阈值为92%)无法满足程序需要,就会出现”Concurrent Mode Failure“失败,这是虚拟机启动后备预案:临时启用Serial Old收集器来重新进行老年代垃圾收集,这样停顿时间就长了。
  • 由于CMS采用标记-清除算法,因此它会产生大量的空间碎片。空间碎片过多时,就给大对象分配空间带来了很大的麻烦。如果无法找到足够大的空间来分配当前对象,就会提前进行Full GC。CMS设置-XX:+UseCMSCompactAtFullCollection(默认开启)会在顶不住进行Full GC时开启内存碎片的合并整理过程,这是无法并发的,空间碎片没了,停顿时间就长了。此外设置-XX:CMSFullGCsBeforeCompaction,可以设置进行多少次Full GC之后来一次压缩的Full GC。

7.G1收集器
G1是一款面向服务端应用的垃圾收集器。G1有以下特点:

  • 并行与并发:G1能利用多CPU的优势来缩短停止用户线程的时间,也可以在GC时让用户线程继续执行
  • 分代收集:能够采用不同的方式来处理新创建的对象和已经存货一段时间的对象
  • 空间整合:G1从整体上采用标记-整理算法,从局部上是基于复制算法,不会产生内存碎片
  • 可预测的停顿:G1和CMS都追求低停顿时间,除此之外,G1还能建立可预测的停顿时间模型

使用G1收集器时,Java堆的内存格局划分为多个大小相等的独立区域(Region),新生代老年代不是物理隔离的,它们都是一部分区域的集合。G1通过追踪各个区域的垃圾堆积的价值大小(回收所获得的空间大小和所花费的时间),在后台维护一个优先列表,每次根据允许的收集时间,优先收回价值最大的区域(Garbage-First由来),这个方法保证了G1的回收效率。

存在的问题:一个对象分配在某个Region,并非只被本Region的对象引用,还可能和其他Region有引用关系,在做可达性分析时,可能需要扫描整个Java堆。 解决办法:虚拟机通过使用Remembered Set来避免全堆扫描,每一个Region对应一个Remembered Set,虚拟机发现程序对引用类型进行写操作时,产生一个Write Barrier中断写操作,检查引用的对象是否处于不同的Region之中,如果是,便通过CardTable把相关的引用信息记录到被引用对象的Region的Remembered Set中,内存回收时,通过在GC根节点的枚举范围加入Remembered Set可保证不对全堆进行扫描
G1收集器运作的步骤:

  • 初始标记:标记GC Roots能直接关联到的对象,速度很快(同CMS)
  • 并发标记:进行GC Roots Tracing的过程(同CMS)
  • 最终标记:修正并发标记期间因用户程序继续运作而导致标记发生变动的那一部分对象的标记记录,对象变化记录存在线程Remembered Set Logs,最终标记就是把Remembered Set Logs数据合并到Remembered Set中。可以和用户线程并发执行
  • 筛选标记:对各个Region回收价值和成本进行排序,根据用户所期望的GC停顿时间制定回收计划。可以和用户线程并发执行

相关文章推荐

Java虚拟机学习 - 垃圾收集器

HotSpot JVM收集器               上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。 Seria...

就那么几种垃圾收集器

1. Serial收集器     Serial收集器是JAVA虚拟机中最基本、历史最悠久的收集器,在JDK 1.3.1之前是JAVA虚拟机新生代收集的唯一选择。Serial收集器是一个单线程的收...

Java垃圾回收器总结

什么是Java垃圾回收器 Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自动回收(...

垃圾收集器的种类及原理

1、Serial收集器:古老的单线程收集器,作用于新生代。单线程的意义并非仅仅是只使用一条线程进行垃圾回收,更重要的是,在进行垃圾回收的时候,必须暂停其他所有的工作线程,因此,用户体验很不好。单实际上...

G1垃圾收集器入门

在此OBE中, 您对Java JVM 中的G1垃圾收集器有了个大致的了解。首先你学到了为何堆和垃圾收集器是所有Java JVM的关键部分。接下来讲述了使用CMS和G1收集器进行垃圾回收的工作方式. 接...
  • renfufei
  • renfufei
  • 2014年12月12日 18:04
  • 32450

浅谈Java语言的垃圾收集器

  • 2013年08月02日 11:27
  • 370KB
  • 下载

G1垃圾收集器入门

  • 2015年01月01日 17:15
  • 1.01MB
  • 下载

CMS垃圾收集器介绍

为期两个月的阿里JVM实习结束了。 在离开科大去实习之前准备了一篇关于Java5中提出的Concurrent Mark Sweep收集器的介绍。 现在贴出来: CMS垃圾收集器           ...

Java垃圾收集器使用小诀窍

  • 2011年06月10日 10:18
  • 28KB
  • 下载

Java垃圾收集器之G1介绍(一)

先来看下Oracle HotSpot JVM的体系结构:    JVM主要组件包括,类加载器,运行时内存区,以及执行引擎,程序员主要关注的应该是运行时区域这块了,  回顾下类加载器的顺序:  ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:垃圾收集器介绍
举报原因:
原因补充:

(最多只允许输入30个字)