美文网首页Android
02 JVM垃圾回收

02 JVM垃圾回收

作者: stoolman | 来源:发表于2020-07-16 10:03 被阅读0次

    java依靠内存垃圾回收(GC),不需要手动释放对象。通过可达性分析判定垃圾,根据对象生命周期的不同使用不同的策略进行回收。

    可达性分析

    分析以GVRoot对象为起点的引用链,不在链上的对象为可回收对象。下面几种对象可作为GCRoot:

    1. 虚拟机栈局部变量表中引用的对象
    2. 方法区中静态引用指向的变量
    3. 存活状态中的线程对象
    4. native方法JNI引用的对象

    GC算法

    1. 标记清除算法:可达性分析,不可达标记为垃圾对象,清除。
      优点是简单,不需要移动对象;缺点是需要停止组件运行,产生内存碎片
    2. 复制算法:内存分区,将存活对象复制到另一分区
      优点是实现简单高效,无内存碎片;缺点是可用内存缩小为一半,对象存活率高时频繁复制;
    3. 标记压缩算法:将存活对象,移动到内存一端
      优点是没有减小可用内存,无内存碎片,性价比高;缺点是需要局部对象移动,降低效率

    JVM分代回收策略

    根据对象生存周期的不同,将对象存放在不同的分区,新生代及老年代,新生代采用复制算法,老年代采用标记压缩算法,提高效率。

    新生代又分为Eden、survivor0及survivor1分区,Eden满触发GC,存活对象复制到S0,再次触发GC复制到S1,S0及S1来回交替,当存活对象在一定次数的GC后依然存活,放到老年区;

    新生代 的 GC 叫作 Minor GC。因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。

    老年代 GC 也叫作 Major GC 或者 Full GC。当出现了 Major GC,经常会伴随至少一次的 Minor GC。

    引用类型

    强:不会回收内存
    软:内存实在不够会回收
    弱:GC会回收
    虚:不会影响对象生命周期

    相关文章

      网友评论

        本文标题:02 JVM垃圾回收

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