美文网首页
GC垃圾回收器

GC垃圾回收器

作者: 少校1222 | 来源:发表于2020-02-11 18:26 被阅读0次

    1、什么是垃圾

    一个对象没有任何引用指向他

    多个对象循环引用但是没有其他的引用指向他们

    2、如何定位垃圾

    reference count(引用计数):一个对象会记录有多少个引用指向了它,当指向它的引用数为0就是垃圾,不能定位循环依赖的情况

             3个引用指向这个对象不是垃圾

              没有引用时是垃圾

    root searching(根可达算法):通过根对象依次找到依赖的对象,剩下的都是垃圾

               什么是根对象:线程栈变量、静态变量、常量池、JNI指针、Class(main方法中可以直接使用的对象)

    3、垃圾回收算法

    Mark-Sweep(标记清除)

         找到是垃圾的部分然后清除,位置不连续会产生碎片

    Copying(拷贝)

           把内存分为两块,只是用其中一块,把存活的对象依次拷贝到另外一块内存中,再分配内存只使用这块内存,然后把剩下是垃圾的内存全部清除,下次再回收时往另外一块拷贝,垃圾回收时存活的对象在两块内存中来回拷贝。

        优点:不会产生碎片,效率很高

        缺点:浪费空间

    Mark-Compact(标记压缩)

          把标记为存活的对象拷贝到标记为可回收或未使用的地方,在做标记和清除的过程中同时做了一次压缩

        好处:是把存活的对象放一块,未使用的内存连续,不会产生碎片,之后再分配大内存是方便

        缺点:效率比拷贝算法略低(内存的挪动带来线程同步)

    4、JVM内存分代模型

        部分垃圾回收器使用的模型

        new-young(新生代):存活对象少,使用Coyp算法,效率高

        old(老年代):垃圾少,一般使用Mark-Compact(标记压缩),G1使用copy

        new-young(新生代):old(老年代) = 1:2

        新生代 : eden(伊甸)+ 2个suvivor区 比例是 8:1:1

        1、YGC(MinorGC)之后大多数的对象会被回收,活着的对象使用拷贝算法放入S0

        2、再次YGC,eden区+S0区活着的对象放入S1

        3、再次YGC,eden区+S1区活着的对象进入S0

        4、经历一次YGC年龄加1 ,达到一定年龄(Parallel Scavenge 15,CMS 6,G1 15)进入老年代,通过参数:-XX:MaxTenuringThreshold配置

        5、S区装不下直接放到老年代

        老年代:

        1、存放的是顽固分子

        老年代满了触发FullGC/FGC/MajorGC

    GC调优的目标是:尽量减少FGC


    5、对象从创建到销毁经历的过程


    6、常见垃圾回收器

        1、Seral: 作用在新生代 串行回收

              当触发GC时所有的工作线程都暂停(STW),GC线程(单线程)开始工作,GC线程完成所有的工作线程才开始工作

        2、Parallel Scavenge: 作用在新生代 并行回收

              当触发GC是所有的工作新城都暂停(STW),GC线程(多线程)开始工作,GC线程完成所有的工作线程才开始工作

        3、ParNew: 作用在新生代 串行回收

              类似于Parallel Scavenge与CMS配合使用的

        4、SeralOld: 作用在老年代 串行回收

              类似于Seral,就是把Seral的算法作用在老年代

        5、ParallelOld: 作用在老年代 并行回收

              类似于Parallel,就是把Parallel的算法作用在老年代

        6、CMS: ConcurrentMarkSweep 作用在老年代 并发的 垃圾回去线程和应用线程同时运行 降低STW时间。既然是MarkSweep,就一定会有碎片化的问题,碎片到达一定程度,CMS的老年代分配对象分配不下的时候,使用SerialOld 进行老年代回收,消耗时间长

        7、G1: 三色标记 + SATB

        8、ZGC: ColoredPointers + LoadBarrier

        9、Shenandoah:ColoredPointers + WriteBarrier

        10、Eplison: debug调试虚拟机用

    1.8默认的垃圾回收器组合是PS+PO                      1.9默认是G1

    7、JVM参数分类

        1、标准参数:-开头 所有的HotSpot都支持

        2、非标准参数:-X开头,特定版本的HotSpot支持特定的命令

        3、不稳定参数:-XX开头

    8、常见垃圾回收器组合参数设定:(1.8)

        -XX:+UseSerialGC = Serial New (DefNew) + Serial Old小型程序。默认情况下不会是这种选项,HotSpot会根据计算及配置和JDK版本自动选择收集器

        -XX:+UseParNewGC = ParNew + SerialOld这个组合已经很少用(在某些版本中已经废弃)

        -XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old

        -XX:+UseParallelGC = Parallel Scavenge + Parallel Old (1.8默认) 【PS + SerialOld】

        -XX:+UseParallelOldGC = Parallel Scavenge + Parallel Old

        -XX:+UseG1GC = G1

        启动java程序时配置参数示例

        java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC(ClassName) PrintGCDetails PrintGCTimeStamps PrintGCCauses

        java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC(ClassName)

        设定日志参数示例参考,共产生5个GC日志文件,每个文件最大20M,滚动使用这5个文件

        -Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause

    9、GC日志详解

    相关文章

      网友评论

          本文标题:GC垃圾回收器

          本文链接:https://www.haomeiwen.com/subject/igaxfhtx.html