zoukankan      html  css  js  c++  java
  • 五、jvm垃圾回收3(几种垃圾收集器)

      根据《深入理解java虚拟机》这本书总结

      前面说到了垃圾标记方法、垃圾收集算法、这篇主要总结一下垃圾收集的具体实现:垃圾收集器

      一、七种常见的垃圾收集器:

        根据所在老年代还是年轻代列出:

        年轻代:Serial、parNew、Parallel Scavenge

        老年代:CMS(Cocurrent Mark Sweep)、Serial Old、Parallel Old

        年轻代+老年代:G1

      二、垃圾收集器具体特点

       1、Serial 

          年轻代单线程收集器,没有线程交互的开销,可以达到单线程最高效率回收。

          采用复制算法实现、回收时需要暂停用户所有线程(stop the world)。

          一般适用于client模式下的年轻代收集,因为对象存活率比较低,并且client内存分配比较小,虽然停顿,但是几十毫秒是可以接受的。

          可以与老年代的:CMS、Serial Old配合使用

       2、Serial Old

          跟Serial一样,老年代的单线程收集器

          采用标记-整理算法实现,回收时需要暂时所有用户线程

          一般适用于client模式下的老年代的收集。

          可以与年轻代的:Serial、parNew、Parallel Scavenge配合使用      

         3、parNew

          Serial升级版,年轻代多线程收集器,可以并行收集(并行:多线程工作。并发:用户线程和手机线程同时工作)。

          采用复制算法,单核存在线程交互开销,在多核机器下效果比较好,回收时需要暂停用户所有线程(stop the world)。。

          可以与老年代的:CMS、Serial Old配合使用

       4、Parallell Scavenge

          年轻代的多线程并行收集器,与其他收集器关注点不同,主要关注吞吐量(运行用户代码时间/jvm总运行时间)

          采用复制算法,回收时需要暂停用户所有线程(stop the world)。。

          不需要手动指定年轻代的各区域大小等,可以动态设定参数,虚拟机会根据当前系统,动态调整最适合的垃圾回收停顿时间,达到需要的吞吐量。

          可以与老年代的:Serial Old、Parallel Old配合使用

       5、Paraller Old

          老年代多线程并行收集器,关注点也是吞吐量,同Parallell Scavenge

          采用标记整理算法,回收时需要暂停用户所有线程(stop the world)

          可以与新生代的:Parallell Scavenge配合使用

       6、CMS

          老年代的多线程并发并行收集器,以获取最短回收停顿时间为目标,常用语互联网B/S架构

          采用标记清除算法,过程为:初始标记(stop the world)-并发标记-重新标记(stop the world)-并发清除

         缺点:

          1、对cpu比较敏感,虽然并发清除期间不暂停用户线程,但是清除会占用一部分cpu资源,导致响应比较慢

          2、咋并发清除阶段产生的浮动垃圾,无法处理

          3、标记-清除,会产生空间碎片。长时间后会导致fullgc。

       7、G1收集器

          1、年轻代和老年代通用的收集器,并发并行收集器,但是现在生产环境还未大量使用

          2、G1与cms不一样,使用标记-整理算法,没有空间碎片。

          3、G1可以控制一次垃圾回收的停顿时间:其余的收集器,要么是针对年轻代、要么是针对老年代,G1的策略不同,将堆的内存布局分为大小相同的n个region,可以有计划的对region进行回收,而不想其他收集器,必须对整个年轻代或者整个老年代回收。当需要进行垃圾收集的时候,g1会维护一个region优先手机列表,根据允许的收集时间来觉得对那些region进行最高效的回收。

          4、g1的垃圾回收是针对于region来做的,这就产生了一个问题,可能当前收集的region中对象,会跟其他没有分配收集region中的对象有关联关系,这一般就需要全局扫描,很耗费时间,但是g1中,region之间的对象引用都使用一个叫Remembered Set来记录,每一个region都有一个set,虚拟机发现对引用类型数据操作时,会检查引用是否处于一个region中,如果不是则记录到set中去。这样在回收region的时候,只需要查看set就能做到对其余region回收的不遗漏。

          5、g1垃圾收集过程:初始标记(stop the world)-并发标记-最终标记(stop the world)-筛选回收(stop the world)

      三、空间分配担保

        都知道,gc回收分年轻代和老年代,当使用复制算法进行回收的时候,会将当前使用的eden和suviovor中的可用对象,复制到另外一个siuvivor中。这时候,如果suvivor中的空间装不下可用的对象,那么怎么办呢?这就是空间分配担保要解决的问题,会将一些年轻较大的对象移动到老年代。那么在年轻代进行minor gc的时候,会进行什么操作?首先会检查老年代的最大可用空间是否大于新生代所有对象的总和,如果成立可以保证直接可以进行gc。如果不成立,那么有一个担保失败的参数,如果该参数设置为允许,那么继续检查老年代最大可用连续空间是否大于历次晋升到老难带对象的平均大小,如果大于,那么直接进行minorgc,否则那么直接进行一次fullgc。当然这里也是有风险的,可能虽然可用连续空间是否大于历次晋升到老难带对象的平均大小,但是这次直接大于不够了,如果不够的话,也只能重新进行一次fullgc了。

      

          

        

  • 相关阅读:
    好消息:Dubbo & Spring Boot要来了
    过年回家,程序猿最怕的5件事
    到底什么是分布式系统?
    SLA服务可用性4个9是什么意思?怎么达到?
    漏洞:会话固定攻击(session fixation attack)
    Mybatis传递多个参数的4种方式(干货)
    注意:阿里Druid连接池监控的两个坑
    消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型?
    Java程序员必须掌握的常用Linux命令。
    编程词汇
  • 原文地址:https://www.cnblogs.com/guoliangxie/p/7384661.html
Copyright © 2011-2022 走看看