hopspot java,jvm学习札记(5)垃圾收集器介绍

jvm学习笔记(5)垃圾收集器介绍

简述:

上一篇系统学习了各种垃圾算法。现在就看看jvm(HopSpot)提供了那些垃圾收集器,怎样搭配使用。先回忆了,然后思考以下问题:新生代和老年代分别用什么算法合适?

Serial收集器

略懂英文的同学大概明白这个词的意思,串行,连续的。没错,这个收集器很简单,当要进行gc时,就暂停所有线程。用复制算法执行完,继续所有线程。又用餐巾纸的例子来说明,清洁大妈高喊一声“stop”,然后所有人静止不动,等收集完,大伙又继续吃饭。有些java程序平时运行正常,隔一段时间“假死”,很可能与它有关。这个收集器看起来问题多多,但是简单高效,适用于实时性不高的场合,如客户端软件。对于服务端程序,就有些不合适了

ParNew收集器

Par是Parallel(并行)的缩写。这个收集器是Serial的多线程版本,算法都是一样的。在多CPU环境下,gc的速度会快很多,减少gc的时间。不幸的是,还是要暂停用户线程

Parallel Scavenge收集器

也是一个并行的收集器,使用的算法同样是复制算法。它的特别之处在于可以控制垃圾收集停顿的时间,从而达到控制吞吐量的目的。例如,收集100m的对象需要100毫秒,你可以选择停顿时间为10毫秒,那么它每次gc最多不超过10毫秒,但是gc的频率肯定会增加。所以盲目调低,可能适得其反

Serial Old收集器

是老年代的Serial版本,单线程,用标记-整理算法。原理类似Serial收集器

Parallel Old收集器

是Serial Old的多线程版本。

CMS收集器

全称 Concurrent Mark Sweep。表明它是并发的,使用标记-清除算法。它的设计比较巧妙,将部分操作与用户线程并发执行,这样就可以显著减少暂停的时间了。共四个过程:

1.初始标记-需要暂停用户线程,标记GC Roots能直接关联到的对象。

2.并发标记-进行跟搜索。

3.重新标记-修正并发标记期间,一些用户操作导致的标志变动。

4.并发清除-与用户线程一起执行,清除被标记的对象。

不足之处有:

1.跟用户线程竞争,导致性能降低。

2.无法处理Float Garbage,就是标记之后,生成的垃圾,这时并发清除是无法发现的。如果这部分垃圾数量比较大,可能引发”Concurrent Mode Failure”,虚拟机会启动预备方案,调用Serial Old收集品,暂停时间可能大大加长。

3.标记-清除算法的弱点是垃圾碎片比较多,可能过早引发Full Gc

Garbage first收集器

这个是比较新的收集器,目前还未正式商用。它的优点有1.使用了“标记-整理”算法,不会产生内存碎片。2.可以精确控制停顿。这优点像Parallel Scavenge收集品,但是它使用了更优秀的方案,后台维护了一个优秀列表,避免全区域扫描,优先回收垃圾最多的区域,可以使得最短的时间内回收最多的垃圾

总结

几种比较合适的方案

1.ParNew + CMS (推荐)

2.Serial + CMS

3.Parallel Scavenge + Parallel Old

参考资料

1.深入java虚拟机

2.深入理解java虚拟机

更多关于jvm的内容可以访问 www.iamcoding.com

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值