JVM的垃圾收集器

JVM的垃圾收集器

Serial收集器(复制)

1,Serial收集器是最基本,历史最悠久的收集器,曾经(在JDK1.3.1之前)是虚拟机新生代收集的唯一选择。
2,Serial是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程(“Stop The World”),直到它收集结束。
3,它依然是虚拟机运行在Client模式下的默认新生代收集器,因为简单而高效。
4,单CPU的环境中比Serial收集器效果好。

ParNew收集器(复制)

1,ParNew收集器其实就是Serial收集器的多线程版本,除了使用多余线程进行垃圾收集之外,其余行为包括Serial收集器可控的所有参数(例如:
-XX:SurvivorRatio,
-XX:PretenureSizeThreshold,
-XX:HandlePromotionFailure等),
收集算法,Stop The World ,对象分配规则,回收策略等都与Serial收集器是一样的。
2,它是许多运行在Server模式下的虚拟机中首选的新生代收集器。
3,默认开始的收集线程数与CPU的数量的一样,可以使用
-XX:ParallelGCThreads参数来限制垃圾收集的线程数。
4,并行(Parallel):是指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
5,并发(Concurrent):是指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序继续执行,而垃圾收集程序运行于另一个CPU上。

Parallel Scavenge收集器(复制)

1,Parallel Scavenge使用的复制算法的收集器,又是并行的多线程收集器。
2,Parallel Scavenge的关注点与其他收集器不同,CMS等收集器的目标则是达到一个可控的吞吐量(Throughput)。
所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码的时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
3,最大垃圾收集停顿时间的 -XX:MaxGCPauseMillis参数(一个大于0的毫秒数),
直接设置吞吐量大小的 -XX:GCTimeRatio参数(一个大于0小于100的整数,如果设为19,则最大GC时间就占总时间的5%(1/(1+19)))。
4,-XX:+UseAdaptiveSizePolicy,是一个开头参数,当这个参数设定时,不需要设置新生代的大小(-Xmn),Eden与Survivor区的比例(-XX:SurvivorRatio),晋升老年代对象年龄(-XX:PertenureSizeThreshold)等细节参数,虚拟机会动态调整这些参数以提供最合适的停顿时间或最大的吞吐量,即GC自适应的调节策略

Serial Old收集器(标记-整理)

1,Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记—整理”算法,被Client模式下的虚拟机的老年代收集算法。
2,在Server模式下,它主要还有两大用途:一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用;另外一个就是作为CMS收集器的后备方案,在并发收集发生Concurrent Mode Failure的时候使用。

Parallel Old 收集器(标记-整理)

1,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记—整理”算法。
2,在注重吞吐量及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge 加 Parallel Old收集器。

CMS收集器(标记-清除)

1,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很多的JAVA应用集中在互联网站或B/S系统是服务器端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带给较好的体验。CMS收集器就非常符合这类应用的需求。
2,初始标记->并发标记->重新标记->并发清除
3,初始标记需要“Stop The World”,只是标记一个GC Roots 能直接关联到的对象,速度很快。
4,并发标记阶段就是进行GC Root Tracing 的过程,
5,重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。这一阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
6,CMS的缺点:
(1)CMS 收集器对CPU资源非常敏感。一般是在4核以上CPU下,效率高(现在的处理器普遍是四核以上)。
(2)CMS无法处理浮动垃圾。-XX:CMSInitiatingOccupancyFration的值来触发百分比。
(3)“标记-清理”导致空间碎片过多,将会给大对象分配很大的麻烦,
-XX:+UseCMSCompactAtFullCollection开关参数,在Full GC后增加一次碎片整理;
-XX:CMSFullGCsBeforeCompaction,这个参数用于设置执行多少次GC后,执行一次碎片整理。

G1收集器(标记-整理)

1,G1收集器是基于“标记-整理”算法实现的收集器,不会产生空间碎片。
2,可以非常精确的控制停顿,既能让使用者明确指定在一个长度为M毫秒的时间片内,又能让消耗在垃圾收集上的时间不得超过N毫秒,是实时Java(RTSJ)的特点。
3,在不牺牲吞吐量的前提下,完成低停顿的内存回收,这是由于它极力避免全区域的垃圾回收,而G1将整个Java堆(包括新生代,老年代)划分为多个大小固定的独立区域(Region),并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域(这就是 Garbage First的由来)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值