深入了解JVM之垃圾回收器

深入了解JVM之垃圾回收器。

1.Serial收集器

Serial收集器是java最古老的收集器之一,特点就是单线程,此处单线程指的是,在GC旗舰,必须暂停其他所有工作线程,也就是所谓的STW(Stop The World),所以此回收器的体验不是特别好,但是对于Client模式的JVM是一个比较好的选择,因为分配内存不是很大的话,GC时间也会比较短

2.ParNew收集器

ParNew收集器是Serial收集器的多线程版本,两者共用了相当部分的源代码。
除了拥有多条线程同时进行垃圾收集之外,其余所有的行为包括控制参数(例如 -XX:SurvivorRatio、-XX:PretenureSizeThreshold等)、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器一样。
ParNew收集器作为很多Server模式的虚拟机首选的新生代回收器其中一个原因就是,ParNew收集器可以与CMS配合工作

3.Parallel Scavenge收集器

Parallel Scavenge收集器是一个新生代收集器,采用的算法为复制算法。但是此回收器关注点与其他回收器不太一样。
Parallel Scavenge收集器更注重与吞吐量这个概念,CMS等收集器更注重于用户线程的停顿时间。
Parallel Scavenge收集器的首选目标就是达到可控制的吞吐量。
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)。
一般来说,停顿时间短的收集器适用于需要与用户交互的程序,因为更需要注重用户体验

4.Serial Old收集器

顾名思义是Serial收集器的老年代版本。同样是一个单线程收集器,使用 标记–整理 算法,此收集器的主要意义也是给Client模式的JVM使用

5.Parallel Old收集器

此收集器是Parallel Scavenge收集器的老年代版本,是一个多线程收集器,使用 标记–整理 算法。是在JDK1.6后提供的。
在此收集器出现之前,Parallel Scavenge收集器的地位一直处于尴尬状态,因为如果选用了Parallel Scavenge收集器作为新生代收集器的话,只能使用Serial Old收集器作为老年代收集器。
由于老年代很大而且硬件比较高级的环境中,如果使用Parallel + Serial Old收集器搭配甚至比不过 ParNew + CMS的吞吐量给力。。。
直到Parallel Old收集器出现之后,Parallel Scavenge收集器才有了名副其实的应用组合

6.CMS(Concurrent Mark Sweep)收集器

CMS的目标就是最短停顿时间,目前相当一部分B/S的服务器上使用的收集器就是CMS收集器,因为此类应用尤其注重响应速度,希望停顿时间尽可能的短,给用户带来尽量好的用户体验。
CMS是一个优秀的收集器,它的主要优点就是,并发收集,低停顿,但是还远远达不到完美的程度,有以下三个缺点:

  1. CMS对CPU的资源尤其敏感,事实上所有多线程任务都对CPU资源比较敏感,它虽然不会导致停顿,但总会占用一部分资源,使得用户进程变慢。
  2. CMS无法处理浮动垃圾,所谓浮动垃圾指的是在回收当次任务中,新产生的垃圾无法在当次回收任务中进行收集,只能等待下次回收进行收集,因为这个原因,CMS不能像其他回收器那样,等老年代内存近乎用光的时候再进行回收,大概会在老年代使用68%(可以通过参数控制,JDK6之后,此数值改为92%)的时候进行回收。当剩下的内存不足以满足程序需要时,就会出现一次“Concurrent Mode Failure”失败。这时回收器会启动后备方案,使用Serial Old收集器重新进行老年代的收集,此时就会停顿相当长的一段时间,当“Concurrent Mode Failure” 出现过多时,性能会不增反降。
  3. 最后一个缺点就是,CMS是基于 标记–清除算法实现的。此算法意味着会有大量空间碎片存在,会给大对象的内存分配带来很大的麻烦,经常会出现,老年代还有足够多的内存时,因为空间碎片不足以分配大对象,导致Full GC。为了解决这个问题,CMS提供一个 -XX:+UseCMSCompactAtFullCollection 开关参数(默认开启)用于在CMS顶不住要进行Full GC的时候进行一次内存合并整理过程,但是由于内存整理的过程是无法并发的,解决了空间碎片的问题,随之而来的就是停顿时间变长的问题。

7.G1(Garbage-First)收集器

G1收集器是目前最前沿的研究成果之一,它的使命是,在未来替换掉CMS收集器,G1收集器有如下特点:
1. 并发与并行:G1能充分利用多CPU,多核环境下的环境优势,使用多个CPU或多个CPU核心来缩短Stop The World的时间,部分其他收集器需要用户线程停顿的GC动作,G1收集器仍然可以用并发的方式让程序继续执行。
2. 分代收集:与其他收集器一样,分代收集的思想在G1得以保留,虽然G1可以不需要其他收集器配合就能管理整个GC堆,但它能采用不同的方式去处理新生代与老年代的对象,以获取更好的收集效果。
3. 空间整合:与CMS的 标记–清除 算法不同的是 G1 整体来看是 标记–整理算法,从局部来看(两个Region之间)是基于复制算法实现的。但无论是那种算法,都意味着G1收集器不会产生空间碎片,分配大对象时不会因为碎片原因产生Full GC
4. 可预测的停顿:这是G1对于CMS的另一大优势,两者都注重于降低停顿时间,但是G1除了降低停顿时间之外,还建立了可预测的停顿时间模型,能让使用者指定,在长度为M毫秒的时间片段内,消耗在垃圾回收的时间不超过N毫秒,这几乎已经是实时JAVA(RTSJ)垃圾收集的特征了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值