垃圾收集器

1、串行回收器

指使用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性和独立性往往有更好的性能表现。串行回收器可以在新生代和老年代使用,根据作用于不同的堆空间,分为新生代串行回收器和老年代串行回收器。

1.1 新生代串行回收器

特点:

(1)、使用单线程进行垃圾回收;

(2)、是独占式的垃圾回收;

(3)、是一个成熟且经过长时间生产环境考验的极为高效的收集器;

(4)、新生代串行处理器使用复制算法;

(5)、实现相对简单、逻辑处理特别高效、且没有线程切换的开销。

1.2 老年代串行回收器

特点:

(1)、使用标记压缩算法;

(2)、串行、独占式的垃圾回收器;

(3)、停顿较长的时间

用途:

可以和多种新生代回收器配合使用,同时它也可以作为CMS回收器的备用回收器。

若启动老年代串行回收器,可以尝试使用以下参数:

-XX:+UseSerialGC :新生代、老年代都使用串行回收器;

-XX:+UseParNewGC:新生代使用ParNew回收器,老年代使用串行收集器;

-XX:+UseParallelGC:新生代使用ParallelGC回收器。老年代使用串行收集器。

2、并行回收器

在串行回收器的基础上做了改进,它使用多个线程同时进行垃圾回收。对于并行能力强的计算机,可以有效缩短垃圾回收所需的实际时间。

2.1 新生代ParNew回收器

特点:

(1) 是一个工作在新生代的垃圾收集器。

(2)、将串行回收器多线程化,它的回收策略、算法以及参数和新生代串行回收器一样。

(3)、独占式回收器

下图为ParNew回收器工作示意图:

开启ParNew回收器可以使用一下参数:

-XX:+UseParNewGC: 新生代使用ParNew回收器,老年代使用串行回收器;

-XX:+UseConcMarkSweepGC:新生代使用ParNew回收器,老年代使用CMS;

-XX:ParallelGCThreads :指定ParNew回收器工作时的线程数量。

2.2 新生代ParallelGC回收器

特点:

(1)、使用复制算法;

(2)、多线程、独占式的收集器;

(3)、非常关注系统的吞吐量;

(4)、支持一种自适应的GC调节策略;使用-XX:+UseAdaptiveSizePolicy可以打开自适应GC策略。

使用以下启用:

-XX:+UseParallelGC:新生代使用ParallelGC回收器。老年代使用串行回收器。

-XX:+UseParallelOldGC:新生代使用ParallelGC回收器。老年代使用UseParallelOldGC回收器。是一对非常关注吞吐量的垃圾回收器组合;

ParallelGC回收器提供了两个重要的参数用于控制系统的吞吐量:

-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间;

-XX:GCTimeRatio:设置吞吐量大小。

2.3 老年代ParallelOldGC回收器

特点:

(1)、是一种多线程并发的收集器;

(2)、关注吞吐量的收集器;

(3)、使用标记压缩算法;

以下是它的工作模式:

3、CMS回收器

特点:

(1)、主要关注于系统停顿时间;

(2)、使用的是标记清除算法,同时又是一个使用多线程并行回收的垃圾回收器。

(3)、不是独占式的,可以在应用程序运行过程中进行垃圾回收。

(4)、是多线程回收器

主要步骤:

初始标记、并发标记、预清理、重新标记、并发清除和并发重置。

初始标记和重新标记是独占系统资源的,而预清理、并发标记、并发清除和并发重置和是可以和用户线程一起执行。

初始标记、并发标记和重新标记都是为了标记出需要回收的对象。

并发清理则是在标记完成后,正式回收垃圾对象。

并发重置是指在垃圾回收完成后,重新初始化CMS数据结构和数据,为下一次垃圾回收做好准备。

 

以下是工作流程示意图:

参数:

启用CMS回收器的参数:-XX:+UseConcMarkSweepGC

默认启动的并发线程数是:(ParallelGCThreads+3)/4 ,ParallelGCThreads表示GC病情时使用的线程数量;

回收阈值可以使用-XX:CMSInitiatingOccupancyFrantion 来指定,默认是68

-XX:+UseCMSCompactAtFullCollection 使CMS在垃圾收集完成后,进行一次内存碎片整理,内存碎片的整理不是并发进行的。

-XX:CMSFullGCsBeforeCompaction 用于设定进行多少次CMS回收后,进行一次内存压缩。

注意:

并发是指收集器和应用线程交替执行,并行是指应用程序停止,同时由多个线程一起执行GC,因此并行回收器不是并发的,因为并行回收器执行时,应用程序完成挂起,不存在交替执行的步骤。

4 G1回收器

从分代上看,G1依然属于分代垃圾回收器,它会区分年轻代和老年代,依然有eden区和survivor区;从堆的结构看,它并不要求整个eden区、年轻代或者老年代都连续。

特点:

(1)、并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力;

(2)、并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此一般来说,不会在整个回收期间完全阻塞应用程序;

(3)、分代GC:G1依然是一个分代收集器,但是和之前回收器不同,它同时兼顾年轻代和老年代。对比其他回收器,他们或者工作在年轻代,或者工作在老年代。因此,这里是一个很大的 不同。

(4)、空间整理:G1在回收过程中,会进行适当的对象移动,不像CMS,只是简单地标记清理对象,在若干次GC后,CMS必须进行一次碎片整理。而G1不同,它每次回收都会有效地复制对象,减少空间碎片。

(5)、由于分区的原因,G1可以只选取部分区域进行内存回收,这样缩小了回收的范围,因此对于全局停顿也能得到较好的控制。

过程:新生代GC 、并发标记周期、混合收集、如果需要,可能会进行Full GC

G1的新生代GC

主要工作是回收eden区和survivor区。一旦eden区被占满,新生代GC就会启动。E 表示eden区,O表示老年代,S表示survivor区。

并发标记周期:

初始标记:标记从根节点直接可达的对象。这个阶段会伴随一次新生代GC,它是会产生全局停顿的,应用程序线程在这个阶段必须停止执行。

根区域扫描:由于初始标记必须会伴随一次新生代GC,所以在初始化标记后,eden被清空,并且存活对象被入survivor区,在这个阶段,将扫描由survivor区直接可达的老年代区域,并标记这些直接可达的对象。这个过程是可以和应用程序并发执行的。但是根区域扫描不能和新生代GC同时执行,因此如果恰好在此时需要进行新生代GC,GC就需要等待根区域扫描结束后才能进行,如果发生这种情况,这次新生代GC的时间就会延长。

并发标记:和CMS类似,并发标记将会扫描并查找整个堆的存活对象,并做好标记。这是一个并发的过程,并且这个过程可以被一次新生代GC打断。

重新标记:和CMS一样,重新标记也是会产生应用程序停顿的。由于在并发标记过程中,应用程序依然在运行,因此标记结果可能需要进行修正,所以在此对一次的标记结果进行补充,在GC1中,这个过程使用SATB算法完成,即G1会再标记之初为存活对象一个快照,这个快照有助于加速重新标记的速度。

独占清理:这个阶段是会引起停顿的。它将计算各个区域的存活对象和GC回收比例并进行排序,识别可供混合回收的区域,在这个阶段,还会更新记忆集。该阶段给出了需要被混合回收的区域并进行了标记,在混合回收阶段,还需要这些信息。

并发清理阶段:这里会识别并清理完全空闲的区域。它是并发的清理,不会引起停顿。

并发周期的主要工作流程:

Full GC: 和CMS类似,并发收集由于让应用程序和GC线程交替工作,因此总是不能完全避免在特别繁忙的场合会出现在回收过程中内存不充足的情况。当遇到这种情况时,G1也会转入一个Full GC进行回收。

G1相关的参数:

-XX:+UseG1GC :标记打开G1收集器开关;

-XX:MaxGCPauseMillis 用于指定目标最大停顿时间;

-XX:ParallelGCThreads 用于设置并行回收时,GC的工作线程数量;

-XX:InitiatingHeapOccupancyPercent 指定当整个堆使用率达到多少时,触发并发标记周期的执行。默认值是45

 

以上内容来源于 <<实战Java虚拟机_JVM故障诊断与性能优化>> 的学习笔记,喜欢的点赞,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值