zoukankan      html  css  js  c++  java
  • 垃圾收集器GC

    (1)DefNew(串行)收集器

         Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器;JDK1.3.1前是HotSpot新生代收集的唯一选择;

       特点:

          (1) 针对新生代采用复制算法,单线程收集器,进行垃圾收集时,必须暂停所有工作线程,直到工作完成。即会:Stop the World

            (2)应用场景:

           依然是HotSpot在Client模式下默认的新生代收集器;      

           也有优于其他收集器的地方:
                简单高效(与其他收集器的单线程相比);
                对于限定单个CPU的环境来说,Serial收集器没有线程交互(切换)开销,可以获得最高的单线程收集效率;
                在用户的桌面应用场景中,可用内存一般不大(几十M至一两百M),可以在较短时间内完成垃圾收集(几十MS至一百多MS),只要不频繁发生,这是可以接受的
           3、设置参数
                   "-XX:+UseSerialGC":添加该参数来显式的使用串行垃圾收集器;
          4、Stop TheWorld说明
              JVM在后台自动发起和自动完成的,在用户不可见的情况下,把用户正常的工作线程全部停掉,即GC停顿;
              会带给用户不良的体验;
              从JDK1.3到现在,从Serial收集器-》Parallel收集器-》CMS-》G1,用户线程停顿时间不断缩短,但仍然无法完全消除;

    (2)ParNew(并行)收集器

    一句话:使用多线程进行垃圾回收,在线程收集时,会Stop-The-World暂停其他所有工作线程直到它收集结束。

      ParNew/Serial Old组合收集器运行示意图如下:

     

    1,ParNew收集器其实就是Serial收集器新生代的并行多线程版本。最常见的应用场景是配合老年代的CMS GC工作,其余的行为和Serial收集器完全一样,

    ParNew垃圾收集器在垃圾收集过程中同样也要暂停所有其他工作线程。他是很多java虚拟机运行在Server模式下新生代的默认垃圾收集器。

    2,常用对应的JVM参数:-XX:+UseParNewGC  启用ParNew收集器,只影响新生代的收集,不影响老年代,

       开启参数后,会使用:ParNew(Young区用)+Serial Old的收集组合,新生代使用复制算法,老年代使用标记-整理算法。

    配置参数:   -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParNewGC (ParNew+Tenured)

    (3)CMS并发标记清除垃圾收集器

           Concurrent Mark Sweep 并发标记清除,并发收集低停顿,并发指的是与用户线程一起执行。

    1.  开启该收集器的JVM参数: -XX:+UseConcMarkSweepGC  开启该参数后会自动将 -XX:+UseParNewGC 打开
    2. 注意开启该参数后:使用ParNew(Young区用)+CMS(Old区用)+Serial Old的收集器组合,Serial Old将作为CMS出错的备用收集器。

    小总结:

      

    (4)G1垃圾收集器

         巩固文章:详解JVM Garbage First(G1)

                           G1垃圾收集器架构和如何做到可预期的停顿

    参考博客:Serial收集器和ParNew收集器

                      ParallelScavenge并行垃圾收集器

                     CMS并发标记清除GC

                     从头到尾,详细分析垃圾回收

                      github的Demo代码地址

    Java半颗糖
  • 相关阅读:
    2.java基础语法(上)
    1.java概述
    Qt layout透明的问题
    Duilib 关于ChildLayout崩溃的问题
    关于注册表使用的几个问题
    win32接口获取ping值
    Web开发中遇到的问题
    DuiLib 窗口透明方法
    通过进程名杀死进程的方法--WIN32
    关于在Qt的MainWindow窗口中添加Layout的问题
  • 原文地址:https://www.cnblogs.com/2019wxw/p/11775496.html
Copyright © 2011-2022 走看看