Java虚拟机-垃圾收集器

垃圾收集器能够分为新生代收集器和老年代收集器;算法

新生代收集器:

一、  Serial收集器多线程

Serial收集器是单线程收集器,采用复制算法,并行收集器,执行的时候须要用户线程暂停。并发

虚拟机运行在Client模式下的默认新生代收集器。性能

二、  ParNew收集器线程

ParNew收集器是多线程收集器,采用复制算法,并行收集器,执行的时候须要用户线程暂停。对象

除了Serial收集器能够和CMS收集器搭配使用以外,就是ParNew收集器;排序

三、  Parallel Scavenge收集器内存

Parallel Scavenge收集器是多线程收集器,采用复制算法,并行收集器,执行的时候须要用户线程暂停。资源

此收集器主要注重的是可控制的吞吐量;虚拟机

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

老年代收集器:

一、  Serial Old收集器

Serial Old收集器是单线程收集器,采用标记-整理算法,并行收集器,执行的时候须要用户线程暂停。

Sweep清理和Compact压缩:

清理就是把废弃的对象干掉,只留下幸存的对象;

压缩就是将移动对象,将空间填满保证内存分为2块,一块是全是对象,一块空闲

二、  Parallel Old收集器

Parallel Old收集器是多线程收集器,采用标记-整理算法,并行收集器,执行的时候须要用户线程暂停。

JDK1.6才开始提供此收集器。

Summary汇总和Compact压缩:

汇老是将幸存的对象复制到预先准备的区域

三、  CMS收集器

CMS收集器是多线程收集器,采用标记-清除算法,并发收集器,执行的时候能够和用户线程一块儿,停顿时间小;

分为四个过程:初始标记、并发标记、从新标记和并发清理

初始标记和从新标记是须要用户线程暂停;

并发标记和并发清理不须要用户线程暂停;

初始标记:标记GC Roots能关联到的对象,停顿时间很短。

并发标记:执行GC Roots查找引用的过程,不须要用户线程停顿。

从新标记:在初始化标记和并发标记期间,有标记变更的那部分仍然须要标记,因此加上这一部分标记过程,停顿时间比并发标记小,可是比初始标记稍微长。

并发清除:在完成标记以后,就开始并发清除,不须要用户线程停顿。

在CMS清理过程当中,只有初始标记和从新标记须要停顿用户线程,并发标记和并发清除不须要用户线程停顿,所以效率很高,很适合高交互的场合。

CMS的缺点:

1:对CPU资源比较敏感

它须要消耗额外的CPU和内存资源,在CPU和内存资源紧张的时候,CPU较少时,会加剧系统负担;CMS默认启动线程数量:(CPU数量+3)/4

2:CMS收集器没法处理浮动垃圾

CMS收集器在并发收集过程当中,用户线程仍然在执行,仍然会产生内存垃圾,因此可能产生浮动垃圾,本次没法清理就只能等待下一次Full GC,由于GC期间须要预留足够内存给用户线程使用,因此使用CMS收集器并非年老代满了才会执行Full GC,而是在使用了一大半(默认68%,也就是2/3,使用-XX:CMSInitiatingOccupancyFraction来设置)的时候就要进行Full GC,若是用户线程消耗内存不是特别大,能够适当调高参数来下降GC次数,以此提升性能。若是预留的用户线程内存不够,则会触发ConcurrentModeFailure,此时将触发备用方案:使用Serial Old收集器来手机,可是这样停顿时间就会长了,所以-XX:CMSInitiatingOccupancyFraction不能设置的过大。

3:CMS采用标记-清除算法,会产生内存碎片

其余收集器:

一、  G1收集器

G1是一款面向服务端应用的垃圾收集器,在JDK1.7中出现。

G1是采用标记-整理算法。

分为4个步骤:初始标记、并发标记、最终标记、筛选回收;

1:初始标记

标记一下GC Roots能直接关联到的对象,而且修改TAMS 的值,让下一阶段用户程序并发运行时可以正确可用的Region中建立新对象。此操做须要停顿线程,耗时很短。

2:并发标记

从GC Roots开始对堆中对象进行可达性分析,找出存活的对象。耗时比较长,能够与用户线程并发执行;

3:最终标记

为了修正并发标记期间,因用户线程继续执行而致使标记产生变更的那一部分标记记录;

虚拟机将这段时间对象变化记录在线程Remembered Set Logs里面。

最终标记须要将Remembered Set Logs里面的数据合并到Remembered Set中。

此操做须要停顿线程,可是能够并行执行。

4:筛选回收

首先将各个Region的回收价值和成本进行排序,根据用户所指望的GC停顿时间来制定回收计划,回收一部分Region,时间是用户控制的,并且停顿用户线程将大幅度提升收集效率。

G1收集器的优势:

1:并行与并发

G1可以充分利用多CPU、多核环境下的硬件优点,使用多个CPU来缩短停顿的时间,部分其余收集器是须要停顿Java线程执行GC动做,G1收集器仍然能够经过并发的方式让Java线程继续执行;

2:分代收集

G1虽然能够不须要其余收集器配合就能独立管理整个GC堆,可是它可以采用不一样的方式处理新建立对象和已经存活了一段时间、熬过屡次GC的旧对象以得到更好的手机效果。

3:空间整合

G1从总体上来看是标记-整理算法实现的收集器,从局部上看是基于“复制算法”实现,可是不管如何这两种算法都意味着G1运做期间不会产生内存空间碎片,收集后可以提供规整的可用内存。

这种特性有利于程序的长时间运行,分配大对象时就不会由于没法找到连续内存空间而提早触发下一次Full GC。

4:可预测的停顿

G1除了追求低停顿外,还能创建可预测的停顿时间模型,能让使用者明确指定在一个长度为毫秒的时间片断内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已是实时Java(RTSJ)的垃圾收集器的特征。

 

G1收集器将Java堆划分为多个大小相等的独立区域Region。

G1之因此可以创建可预测的停顿时间模型,主要是它有计划得避免了在整个Java堆中进行全区域的垃圾收集。

G1跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据容许收集时间,优先回收价值最大的Region。

这种使用Region划分空间以及优先级的区域回收方式,保证了G1在有限的时间内能够获取尽量高的收集效率。

相关文章
相关标签/搜索