java编程思想 持有对象(三种弱引用与WeakHashMap)

其中SoftReference只在内存不够时回收其包含的对象,WeakReference则在任何时候都可能回收。而PhantomReference则最弱(虚引用),任何时候都不能从中get对象(只会得到null),而且必须和ReferenceQueue一起使用,它存在的目的就是监控包含对象被释放的事件,从而可以起到finalize的作用,即可以做最后的善后工作。(finalize已于java SE9弃用)

相关博客:https://www.cnblogs.com/cord/p/11546303.html

https://blog.csdn.net/zqz_zqz/article/details/79474314

https://www.cnblogs.com/dfyz/articles/5389122.html

https://blog.csdn.net/u014294681/article/details/86511451

另,关于引用链的等级的表述来自:https://www.cnblogs.com/xdouby/p/6701941.html(害怕到时候链接挂了所以截图了,侵删)

 

 

关于WeakHashMap

WeakHashMap的键是WeakReference类型的,其中有一个ReferenceQueue(域名queue),在运行中GC可能会回收一些键的空间(因为其是WeakReference,而且会被放入queue),而每次调用时都会同步queue和键值对信息,并从键值对中删除所有被回收的键。

 

这一部分应该会用于有大量大型且不常使用的数据的情况,每次使用时如果发现对象没有被回收则正常使用,否则重新构建对象。

 

贴上代码,写的不太好

import java.lang.ref.*;
import java.util.LinkedList;
import java.util.WeakHashMap;

public class Ans {
    static class VeryBig {
        VeryBig(String s) {name = s; }
        VeryBig(int t) {i = new long[t];}
        @Override
        public String toString() {
            return "VeryBig{" +
                    "name='" + name + '\'' +
                    '}';
        }

        @Override
        protected void finalize() throws Throwable {
            System.out.println("final "+name);
        }

        long []i = new long[10000];
        String name;
    }

    static void check() {
        Reference<? extends VeryBig> r = rq.poll();
        if (r!=null) System.out.println("In queue "+r);
        else System.out.println("NULL");
    }

    public static void main(String[] args) {
        LinkedList<SoftReference<VeryBig>> sr = new LinkedList<>();
        LinkedList<VeryBig> vb = new LinkedList<>();
        LinkedList<WeakReference<VeryBig>> wr = new LinkedList<>();
        LinkedList<PhantomReference<VeryBig>> pr = new LinkedList<>();

        SoftReference<VeryBig> s = new SoftReference<>(new VeryBig("S"),rq);
        //WeakReference<VeryBig> w = new WeakReference<>(new VeryBig("S"),rq);

        Reference<?> r;
        //while ((r=rq.poll())==null) {sr.add(new SoftReference<>(new VeryBig(1000)));System.out.println("1");}
        System.out.println("YES");
        while(true) {
            sr.add(new SoftReference<>(new VeryBig(1000 ),rq));
            check();
        }
       /* for (int i = 0;i<5000;) {
            //if (i%100==0) vb = new LinkedList<>();
            System.out.println(i);
            vb.add(new VeryBig("Soft "+i));
            //System.out.println("just "+sr.getLast().get());
           // check();
        }*/

        /*for (int i = 0;i<5000;++i) {
            wr.add(new WeakReference<>(new VeryBig("Weak "+i),rq));
            //System.out.println("just "+wr.getLast().get());
            check();
        }*/
        //System.gc();
       /* for (int i = 0;i<300;++i) {
            pr.add(new PhantomReference<>(new VeryBig("Ph "+i),rq));
            //System.out.println("just "+pr.getLast().get());
            //check();
        }*/
        //System.out.println(pr.get(3).get());
    }

    static ReferenceQueue<VeryBig> rq = new ReferenceQueue<>();
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值