欢迎光临散文网 会员登陆 & 注册

Java虚拟机-垃圾回收器

2020-10-10 11:37 作者:bili_93709487  | 我要投稿

新生代垃圾收集器:Serial、ParNew、Parallel Scavenge

老年代收集器:CMS、Serial Old、Parallel Old

新生代和老年代都能回收的收集器:G1

Serial收集器

Serial收集器是一个单线程工作的收集器,在它进行垃圾回收工作时,必须暂停其他所有工作线程(Stop The World),直到收集结束。

  • 对于内存资源受限的环境,Serial是所有收集器中消耗额外内存最小的。

  • 单核处理器或者处理器核心较少的环境,Serial由于没有线程交互的开销,可以获得最高的单线程收集效率

ParNew收集器

ParNew收集器实质上是Serial收集器的多线程版本,ParNew的多线程指的是垃圾回收时进行多线程的回收,并不能和用户线程一起工作,依然需要Stop The World。

Parallel Scavenge收集器

Parallel Scavenge是基于“标记-整理算法”实现的垃圾收集器,也能够进行并行收集的多线程收集器。

Parallel Scavenge收集器关注的是达到一个可以控制的吞吐量

吞吐量=运行用户代码时间 /(运行用户代码时间+运行垃圾收集的时间)


Serial Old收集器

Serial Old收集器是Serial的老年代版本,它同样是一个单线程收集器,使用“标记-整理算法”

在服务端模式下,他的两个用途:

  • 在Jdk5版本之前中Serial Old和Parallel Scavenge配合使用。

  • 在CMS收集器发生失败后(并发收集出现Concurrent Mode Failure时)使用。

Parallel Old收集器

Parallel Old收集器时Parallel Scavenge的老年代版本,支持多线程并发收集基于“标记-整理算法”实现

CMS(Concurrent Mark Sweep)收集器

CMS收集器以获取最短停顿时间为目标,是基于“标记-清除”算法实现的。收集过程分为四个步骤:

  • 初始标记:需要暂停用户进程,工作是标记GC Roots能直接关联的对象。

  • 并发标记:从GC Roots直接关联的对象开始遍历对象图。(与用户进程并发运行)

  • 重新标记:需要暂停用户进程,为了修正并发标记期间,用户程序运行导致标记产生变动的对象的标记记录。

  • 并发清除:清理掉被标记阶段判断已经“死亡”的对象。(与用户进程并发运行)

CMS收集器的缺点:

  • 面向并发设计的程序都对处理器资源比较敏感。在并发阶段CMS虽然不会导致用户进程停顿,但是会消耗一部分线程资源,导致应用程序变慢,吞吐量降低。

  • CMS收集器无法处理“浮动垃圾”,有可能会出现“Concurrent Mode Failure”而导致“Full GC”的发生。

  • CMS是一款基于“标记-清除算法”的收集器,收集结束会产生大量的空间碎片。在空间碎片过多时,会对大对象分配带来很大的麻烦,无法分配足够大的连续空间时,不得不提前触发“Full GC”

浮动垃圾是指CMS收集器在并发标记和清除阶段,用户程序产生的垃圾,CMS收集器无法在当次垃圾收集中处理掉它们。

G1(Garbage First)收集器

G1收集器开创了收集器面向局部收集的思路和基于Region的内存布局。

Region中还有一类特殊的Humongous区域,专门用来存放大对象(大小超过Region的一半)。

G1仍然保留了新生代和老年代的概念,但是新生代和老年代不是固定的,它们都是一系列区域的动态集合。

G1可以面对堆内存中的任何部分进行回收,衡量保准不是内存属于哪一个分代,而是哪块内存中存放的垃圾最多,回收收益最大,这就是G1的Mixed GC模式。

G1收集器的运作过程:

  • 初始标记:标记GC Roots能直接关联到的对象,并修改TAMS指针的值,让下一阶段用户进程并发运行时能在可用的Region中分配对象。

  • 并发标记:从GC Roots直接关联的对象开始,对堆中对象进行可达性分析,找出要回收的对象。

  • 最终标记:暂停用户线程,处理并发阶段结束后仍然遗留下来的最后少量的SATB记录。

  • 筛选回收:负责更新Region的统计数据,对Region的回收价值和成本进行排序,根据用户期望停顿时间来制定回收计划,把存活的对象复制到空Region中,然后清空这个旧Region。

与CMS比较:

  • G1从整体角度上看是使用的“标记-整理算法”,从Region的角度看使用的是“标记-复制算法”。不会产生空间碎片。

  • G1为了垃圾收集产生的垃圾占用和程序运行时的额外负载都比CMS高。


Java虚拟机-垃圾回收器的评论 (共 条)

分享到微博请遵守国家法律