【JVM】6_GC存活分析算法之引用计数法的优缺

13 篇文章 0 订阅

引用计数法(Reference Counting)的含义:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。


优点:客观地说,引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软公司的COM(Component Object Model)技术、使用ActionScript 3的FlashPlayer、Python语言和在游戏脚本领域被广泛应用的Squirrel中都使用了引用计数算法进行内存管理。


缺点:主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题

/**
 * VM参数 : -XX:+PrintGC  (用来输出GC日志)
 * 或者 -XX:+PrintGCDetails 来输出详细日志
 */
public class Main {

    public static void main(String[] args) {

        TestObj t1 = new TestObj();
        TestObj t2 = new TestObj();
        //对象间相互引用
        t1.refObj = t2;
        t2.refObj = t1;
        //引用指向空
        t1 = null;
        t2 = null;
        //立即执行GC回收
        System.gc();

    }
}

class TestObj {

    private static final int _1MB = 1024 * 1024;

    /**
     * 这个成员属性的唯一意义就是占点内存,以便在能在GC日志中看清楚是否有回收过
     */
    private byte[] bigSize = new byte[4 * _1MB];

    public TestObj refObj = null;
}


输出的GC日志:

[GC (System.gc())  14700K->848K(249344K), 0.0007753 secs]
[Full GC (System.gc())  848K->636K(249344K), 0.0045591 secs]
14700K->848K可以看出t1和t2所引用的对象已被回收了,而两个对象之间是相互引用的,虚拟机并没有因为这两个对象互相引用就不回收它们,这也从侧面说明虚拟机并不是通过引用计数算法来判断对象是否存活的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值