zoukankan      html  css  js  c++  java
  • Java之WeakReference与SoftReference使用

    如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。

      java.lang.ref.WeakReference

      不过,现在有了 Weak Reference之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference来记住此对象,而不是用一般的 reference。

    A obj = new A();
        WeakReference wr = new WeakReference(obj);
        obj = null;

        //等待一段时间,obj对象就会被垃圾回收
    ...

    if (wr.get()==null) {
    System.out.println("obj 已经被清除了 ");
    } else {
    System.out.println("obj 尚未被清除,其信息是 " obj.toString());
    }
    ...
      在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。

      这类的技巧,在设计 Optimizer 或 Debugger这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以影响此对象的垃圾收集。

      java.lang.ref.SoftReference

       Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 DirectReference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得Soft Reference 也适合拿来实作 pooling 的技巧。

        A obj = new A();
        SoftRefenrence sr = new SoftReference(obj);

        引用时

        if(sr!=null){
            obj = sr.get();
        }else{
            obj = new A();
            sr = newSoftReference(obj);
        }

  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/jayceli/p/2594983.html
Copyright © 2011-2022 走看看