美文网首页
垃圾回收

垃圾回收

作者: sunshaohua520 | 来源:发表于2021-05-24 20:23 被阅读0次

    标记阶段

    判断对象是否可回收方法:

       1.引用计数法,问题:循环引用

       2.可达性分析法;

            不可达的对象一定会被回收吗?不一定,如下

    回收过程的两次标记:

    1.第一次标记:GC Roots到该对象没有引用链。

    2.第二次标记:如果对象重写finalize()方法,则被加入到队列,由优先级较低的线程执行finalize(),如果执行发现与引用链建立联系,则该对象被移除“即将回收”集合。finalize()只可能调用一次。

    GC roots包含以下几类元素:

    1.虚拟机栈上引用的对象;

    2.本地方法栈上引用的对象;

    3.方法区中类静态属性引用的对象;如静态变量

    4.方法区中常量引用的对象;如常量池的引用

    5.被同步锁(sychnorized)住的对象;

    清除阶段

    垃圾收集算法:标记-清除算法,复制算法,标记-压缩(标记-整理)算法;

    新生代:复制算法

    老年代:标记压缩算法

    增量收集算法:每次收集一小片区域,和用户线程交替执行,多次收集

    分区算法:将整个堆分成多个小区域,每一个小区域独立使用、独立回收。如G1

    并发:多个线程在某一时间段内同时发生

    并行:多个线程在任一时间点内同时发生

    引用

    强引用:只要引用关系存在,就不会回收 Object object = new Object();

    弱引用:引用关系虽然存在,但会在内存空间不够时被回收 

        SoftReference sr = new SoftReference<Object>(new Object());

        Object = sr.get();

    软引用:引用关心虽然存在,但会在下次回收时候被回收

        WeakReference WeakHashMap

    虚应用:一个对象是否有虚引用,对其生存周期没有任何影响,也无法通过虚引用获得对象实例,虚引用的目的是在回收时,收到系统通知

    垃圾收集器

    串行回收器:Serial,Serial Old

    并行回收器:ParNew,Parallel Scavenge,Parallel Old

    并发回收器:CMS,G1

    回收器组合关系

    Serial回收器:jdk1.3之前回收新生代唯一选择,单线程采用复制算法串行回收,stw,

    Serial Old回收器:老年代版本,单线程采用标记整理算法,串行回收,stw

    ParNew回收器:Serial的多线程版本

    CMS:低延迟,第一款并发回收器,标记清除算法,会产生内存碎片,对cpu资源敏感,无法清理浮动垃圾(并发标记过程产生的垃圾)

        初始标记 stw

        并发标记

        重新标记 stw

        并发清理

        重置线程

    Parallel Scavenge:吞吐量优先,自适应调节吞吐策略,复制算法,并行回收,stw,适合后台运算而不需要交互,如批量处理、订单处理、工资支付等

    Parallel Old:是Parallel Scavenge的老年代版本

    G1回收器

    G1:面向服务单,适用多核CPU、大内存的机器,满足低延迟同时兼顾吞吐量

        并发、并行

        分区收集:同时兼顾年轻代、老年代

        空间整合:复制+标记整理算法

        可预测的停顿时间模型:可指定回收区域,缩小回收范围,

       缺点:额外的内存占用,及更高的负载 

    G1回收过程:

    垃圾收集器总结

    相关文章

      网友评论

          本文标题:垃圾回收

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