下图已经列出来了这,其中Epsilon是debug使用的,不用过分关注;最常见的组合有:Serial +Serial Old 、Parallel Scavenge + Parallel Old 、ParNew + CMS。G1之前都是不仅在逻辑上是分代的而且在物理层面上也是分代的;G1只是在逻辑上分代;G1之后完全不分代,但是在生产环境使用的很少;
当垃圾收集器工作时所有工作线程全部停止,这里线程停下来一定会停在一个安全点上;
safe-point :线程停止(需要找到一个安全点上线程停止),因为停顿的时间长,现在很少用;
这个垃圾收集器用在老年代,它用的是mark-sweep的算法,他用的是单线程;
其实就是parallel new 的意思,和Parallel Scavenge没有很大的区别,就是它的新版本,做了一些的增强以便能够让它和CMS有更好的配合使用,CMS在某个特定的阶段会和Parallel New 同时运行。在工作的时候其余的线程不能够工作,必须等GC回收器结束后才可以。
CMS非常重要,它诞生了一个里程碑,以前的垃圾回收器在工作的时候其他的线程都要停下来,等我工作完,才能工作,CMS的出现消除了这个问题,与此同时CMS也带来了很多问题,以至于目前的所有的JDK版本默认都不是使用它。
垃圾回收器在工作的时候,垃圾回收的线程和工作线程同时进行,叫做:concurrent mark sweep;当内存比较小的情况下,清理垃圾的速度比较快没有问题,当内存越来越大较的时候,大到什么程度呢?大到你用多少线程进行清理的都需要很长一段时间,以前10G的内存的时候使用默认的ps+po大概需要的时间为11s。
为什么会出现并发垃圾回收器? 并发垃圾回收器出现的原因是因为忍受不了STW.
什么条件下会触发CMS呢?老年代分配不下了,这时会触发CMS,这里的初始标记是单线程,重新标记是多线、CMS的缺点:CMS出现问题后会调用Serial Old使用单线程进行标记压缩;
这个是比比较严重的一个问题,如果内存超级大,产生了很多的碎片,这就会浪费很多的空间,其实CMS设计出来就是应付几百兆的内存至上G的内存,有的人拿它来应付很大内存就会出现问题,因为一旦老年代产生很多碎片,从新生代过来的对象就会出现找不到空间的情况,这叫做:PromotionFailed找不到空间。这时候它干了一件事情,把Serial Old 请出来,让它用一个线程在这里进行标记压缩。
解决方法:SATB (snapshot at the beginning) 在起始的时候做一个快照
Incremental Update : 当一个白色对象被一个黑色对象引用时,将黑色对象重新标记为灰色,让垃圾回收器重新扫描;
常见的垃圾回收器就介绍这么多,下一篇会给大家介绍一下 PS+PO;如果写的有误的地方还请大佬指出;
- 本文固定链接: http://fenleilaji.cc/?id=26287
- 转载请注明: admin 于 分类垃圾-环境保护从分类垃圾做起! 发表
《本文》有 0 条评论