JVM学习之:垃圾收集器

垃圾收集器

如下图所示,收集器之间有连线,说明它们可以搭配使用
在这里插入图片描述

新生代收集器

1、Serial收集器:

  • 工作区域:新生代
  • 单线程/多线程:单线程
  • 垃圾收集算法:复制算法

Serial收集器是最基本、发展历史最悠久的收集器,是一个单线程的收集器,进行垃圾收集时,必须暂停其他所有的工作现场,直到它收集结束(Stop The World)。

2、ParNew收集器:

  • 工作区域:新生代
  • 单线程/多线程:多线程
  • 垃圾收集算法:复制算法

ParNew收集器就是 Serial收集器的多线程版本。

3、Parallel Scavenge收集器:

  • 工作区域:新生代
  • 单线程/多线程:多线程
  • 垃圾收集算法:复制算法

Parallel Scavenge收集器的目的是达到一个可控制的吞吐量(Throughput)。吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即:吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

老年代收集器

1、Serial Old收集器

  • 工作区域:老年代
  • 单线程/多线程:单线程
  • 垃圾收集算法:标记整理算法

这个收集器的主要意义也是在于给Client模式下的虚拟机使用。
如果在Server模式下,主要两大用途:
(1)在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用
(2)作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用

2、Parallel Old收集器

  • 工作区域:老年代
  • 单线程/多线程:多线程
  • 垃圾收集算法:标记整理算法

Parallel Old 是Parallel Scavenge收集器的老年代版本。这个收集器在1.6中才开始提供。
在JDK1.5以及之前的版本中,Parallel Scavenge+Serial Old(单线程),无法充分利用多CPU的处理能力。1.6之后,终于有了名副其实的“吞吐量优先“收集器组合:Parallel Scavenge + Parallel Old。

3、CMS收集器(Concurrent Mark Sweep)

  • 工作区域:老年代
  • 单线程/多线程:多线程
  • 垃圾收集算法:标记-清除算法

CMS收集器(Concurrent Mark Sweep)是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或B/S系统的服务端上,这里应用尤其重视服务的响应速度,希望系统停顿时间最短,CMS非常符合这类应用的需求。整个过程分为四个步骤:

  • 初识标记(CMS initial mark):标记GC Roots能直接关联到的对象,速度很快;
  • 并发标记(CMS concurrent mark):进行GC Roots Tracing(追踪)的过程;
  • 重新标记(CMS remark):为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
  • 并发清除(CMS concurrent sweep)

其中,初识标记、重新标记这两个步骤仍然需要“Stop The World”,还没有达到完美的程度,有以下三个缺点:

  • CPU资源敏感:

    在并发阶段,虽然不会导致用于线程停顿。但会因为占用了一部分CPU资源,导致用户应用程序变慢,吞吐量降低。

  • 无法处理浮动垃圾:

    并发清理阶段,用户线程仍旧在运行并产生垃圾,这些产生的垃圾此次收集无法清理。因此,需要预留一部分内存用于并发清理时用户程序使用。
    当预留的内存不够时,将发生Concurrent Mode Failure,JVM启动后备预案,临时启用Serial Old进行老年代垃圾收集-XX:CMSInitiatingOccupancyFraction

  • 内存碎片问题

    标记-清除算法会产生大量空间碎片。为了解决这个问题CMS提供
    -XX:CMSFullGCsBeforeCompaction 参数设置执行多少次不带压缩的Full GC后,运行一次带压缩的(默认为0,表示每次Full GC都进行碎片整理)

G1收集器

  • 工作区域:新生代、老年代
  • 单线程/多线程:多线程
  • 垃圾收集算法:分代收集

G1收集器将java堆均分成大小相同的区域。一个或多个不连续的区域共同组成eden、survivor或old区,但大小不再固定,这为内存应用提供了极大地弹性。G1垃圾收集过程与CMS类似。G1在堆内存中并发地对所有对象进行标记,决定对象的可达性。经过全局标记,G1了解哪些区域几乎是空的,然后优先收集这些区域,这就是GarbageFirst的命名由来。G1将垃圾收集和内存整理活动专注于那些几乎全是垃圾的区域,并建立停顿预测模型来决定每次GC时回收哪些区域,以满足用户设定的停顿时间。

对于区域的回收通过复制算法实现。在完成标记清理后,G1将这几个区域的存活对象复制到一个单独区域中,实现内存整理和空间释放。这一过程通过多线程并行进行来降低停顿时间,提高吞吐量。通过这样的方式,G1在每次GC过程中持续清理碎片,控制停顿时间满足用户要求。这时过去虚拟机无法做到的。CMS不清理内存碎片(除非通过虚拟机参数设置,在每次或多次FullGC后进行整理),ParallelOld进行全堆整理,会导致较长的停顿时间。

G1不是实时垃圾收集器,它会尽量让停顿时间低于用户设置的停顿时间目标但不能保证一定如此。G1根据历史垃圾收集监测数据来 预测每个区域的回收时间,然后根据用户设定的目标停顿时间决定每次GC时可以回收哪些区域。G1通过这种方式建立比较精确的区域回收时间预测模型。
G1收集器大致可以分为以下几个步骤:

  • 初始标记(Initial Marking)
  • 并发标记(Concurrent Marking)
  • 最终标记(Final Marking)
  • 刷选回收(Live Data Counting and Evacuation)

垃圾收集相关的常用参数

UseSerialGC:

虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收

UseParNewGC:

打开此开关后,使用ParNew + Serial Old的收集器组合进行内存回收

UseConcMarkSweepGC:

打开此开关后,使用ParNew+ CMS + Serial Old的收集器组合进行内存回收。Serial Old收集器将作为CMS收集器出现Concurrent Mode Failure失败后的后备收集器使用

UseParallelGC:

虚拟机运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge + Serial Old (PS Mark Sweep)的收集器组合进行内存回收

UserParallelOldGC:

打开此开关后,使用Parallel Scavenge + Parallel Old的收集器组合进行内存回收

SurvivorRatio:

新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden: Survivor = 8:1

PretenureSizeThreshold:

直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配

MaxTenuringThreshold:

晋升到老年代的对象年龄。每个对象在坚持过一次Minor GC之后,年龄就增加1,当超过这个参数值时就进入老年代

UseAdaptiveSizePolicy:

动态调整Java堆中各个区域的大小以及进入老年代的年龄

HandlePromotionFailure:

是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的极端情况

ParallelGCThreads:

设置并行GC时进行内存回收的线程数

GCTimeRatio:

GC时间占总时间的比率,默认值是99, 即允许1%的GC时间。仅在使用Parallel Scavenge收集器时生效

MaxGCPauseMillis:

设置GC的最大停顿时间。仅在使用Parallel Scavenge收集器时生效

CMSInitiatingOccupancyFraction:

设置CMS收集器在老年代时间被使用多少后触发垃圾收集。默认值为68%,仅在使用CMS收集器时生效

UseCMSCompactAtFullCollection:

设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效

CMSFullGCsBeforeCompaction:

设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理,仅在使用CMS收集器时生效

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值