jvm学习笔记(5)垃圾收集器介绍_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > jvm学习笔记(5)垃圾收集器介绍

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

 2011/11/22 9:23:19  janeky  http://janeky.iteye.com  我要评论(0)
  • 摘要:简述:上一篇系统学习了各种垃圾算法。现在就看看jvm(HopSpot)提供了那些垃圾收集器,怎样搭配使用。先回忆了,然后思考以下问题:新生代和老年代分别用什么算法合适?Serial收集器略懂英文的同学大概明白这个词的意思,串行,连续的。没错,这个收集器很简单,当要进行gc时,就暂停所有线程。用复制算法执行完,继续所有线程。又用餐巾纸的例子来说明,清洁大妈高喊一声“stop”,然后所有人静止不动,等收集完,大伙又继续吃饭。有些java程序平时运行正常,隔一段时间“假死”,很可能与它有关
  • 标签:笔记 学习 JVM 学习笔记

  • 简述:
  • 上一篇系统学习了各种垃圾算法。现在就看看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

    发表评论
    用户名: 匿名