hotspot垃圾收集器简介

简介

如果收集算法是虚拟机收集对象的灵魂,那么垃圾收集器就是收集对象的实现工具。hotspot虚拟机包含的虚拟机如下图所示:
这里写图片描述

新生代

Serial垃圾收集器

Serial收集器是一个历史悠久的收集器,现在服务器端的JDK很少沿用了,除非你的服务器还在使用JDK1.3以前的版本,否则一般都是废弃的状态。它是采用“复制算法”来实现的。

该收集器是一个单线程的收集器,意思就是当发生垃圾回收的时候,只有一个CPU和一个一条线程进行收集,并且还要停止掉其他的线程(这一过程也成为“stop the world”)。

但是由于Serial是单核单线程的回收垃圾,所以在stop the world的过程中,用户的相应也停止了。比如运行一个小时,暂停相应5分钟,这个是接受不了的。所以现在的Serial收集器一般都用在Client模式下作为新生代的收集。因为在Client模式下,一般堆内存的大小也就只有几百兆而已,停顿时间几百毫秒以下是可以接受的。

ParNew垃圾收集器

ParNew收集器其实就是Serial收集器的多线程版本,它可以并行的实现垃圾收集。它与Serial的回收策略,收集算法等都是一样的,所以都会有”stop the world”。

ParNew收集器是当前运行在服务端最多的新生代收集器,而且更重要的一个原因是,目前只有它和Serial收集器能和老年代的CMS收集器配合使用。如果你的老年代选择了CMS收集器,那毫无以为,新生代就必须选择ParNew收集器了。

关于性能,Serial和ParNew的区别是单线程和多线程。但是在双核心的情况下,ParNew收集器不一定就完胜Serial收集器了,因为ParNew的多线程需要花费资源在控制线程收集的方面。所以可以说,当服务器核心越多,ParNew收集器的效率就越发明显了。

Parallel Scavenge收集器

Parallel Scavenge收集器也是一个采用复制算法的收集器并且也是和ParNew一样是一个并行多线程的收集器。但是该收集器关注的是“吞吐量”。什么是吞吐量呢?就是“用户运行的代码时间/(用户运行的代码时间+垃圾收集的时间)”。比如虚拟机运行了100分钟,垃圾收集了1分钟,那么吞吐量为(100-1)/100=0.99=99%,吞吐量越大代表着用户的体现越好。

Parallel Scavenge提供了两个参数精确的控制吞吐量
1.控制最大垃圾收集停顿时间 -XX:MaxGCPauseMillis
设置垃圾收集最大停顿时间不是越少越好的哦,如果你设置的时间很小,那么垃圾收集的频率也就越大。这些都是相对的。
2.直接设置吞吐量大小 -XX:GCTimeRatio
该参数可以设置一个大于0小于100的值,是按一个百分比的。
这两个参数可能在以后的JDK版本中会改变哦。

Parallel Scavenge收集器还有一个很好用的开关参数,那就是-XX:UseAdaptiveSizePolicy值,当打开这个值之后,就不需要手工的设置新生代和老年代的一些参数细节,比如Eden区、晋升老年代的年龄等。这种方式也成为“GC自适应策略”。这也是该收收集器和ParNew的区别。

老年代

Serial Old收集器

Serial Old收集器是Serial的老年代的版本,主要采用的是标记-整理算法清楚垃圾对象。现在它主要是用在Client端够配合的新生代收集器有Serial。现在的服务端已经很少使用了。

Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,在以前的版本中Parallel Scavenge只能配合Serial Old来进行老年代的收集,效率并不高,现在出现了Parallel Old,可以实现并行的收集老年代的对象了,采用的也是标记-整理算法进行收集哦。

CMS(Concurrent Mark Sweep)收集器

CMS收集器是现在主流的老年代收集器,它采用的是标记-清除算法来实现的。但是它的收集过程有一点儿复杂,大致可以分为4部分:
1.初始标记
这一步是需要暂停用户运行的程序的即“stop the world”,初始化标记是单线程的且停顿时间会很短,因为它只是标记GC Roots的对象。

2.并发标记
并发标记是进行初始标记GC Roots对象的延伸标记,主要是判断那些对象成为了垃圾对象了。该也断也是一个单线程的,但是能够与用户线程并发执行,虽然时间比初始标记长,但是无关紧要。

3.重新标记
重新标记的作用是处理并发标记错过的垃圾对象,这里并不是收集并发标记用户在那段时间产生的垃圾对象哦,注意。

4.并发清除
并发清除是把前面阶段标记的垃圾对象统一进行清除,该阶段是并发的,所以用时也是比较久的。

CMS的缺点:
1.CMS收集器无法清理浮动的垃圾,就是在并发标记的时候,用户产生的浮动垃圾只能在下次GC收集的时候在清除了。

2.因为CMS采用标记-清除算法实现的,所以会产生内存碎片,对于分配大的对象是很麻烦的事情。

G1收集器

G1收集器的全名叫Garbage-First,是当今技术最新进的代表成果之一。是未来最可能代替CMS的收集器。它不想其他收集器,规整的新生代和老年代。而是分为大小相等的独立区域(Region),虽然还保留其概念,但是新生代老年代不在隔绝。它的收集步骤是:
1.初始标记
标记GC-Roots直接能关联的对象。是单线程的并且用户线程停止。

2.并发标记
在GC-Roots对象中进行可达性分析,找出存活对象,这个阶段比较长,但是能够与用户的线程并行。

3.最终标记
最终标记是是把在并行标记期间产生的对象进行分析标记,这个阶段是并行的,但是用户线程是停止的。

4.筛选回收
筛选回收内存,G1会根据Region的回收价值和成本进行计划回收。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值