快速业务通道

Java中对象的强、软、弱和虚引用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
Java集合中有一种特殊的Map类型—WeakHashMap,在这种Map 中存放了键对象的弱引用,当一个键对象被垃圾回收器回收时,那 么相应的值对象的引用会从Map中删除。WeakHashMap能够节约存储 空间,可用来缓存那些非必须存在的数据。关于Map接口的一般用 法。

下面示例中MapCache类的main()方法创建了一个WeakHashMap对 象,它存放了一组Key对象的弱引用,此外main()方法还创建了一 个数组对象,它存放了部分Key对象的强引用。

import java.util.WeakHashMap;

class Element {    private String ident;    public Element(String id) {     ident = id;    }    public String toString() {     return ident;    }    public int hashCode() {     return ident.hashCode();    }    public boolean equals(Object obj) {     return obj instanceof Element && ident.equals(((Element) obj).ident);    }    protected void finalize(){     System.out.println("Finalizing "+getClass ().getSimpleName()+" "+ident);    } } class Key extends Element{    public Key(String id){     super(id);    } } class Value extends Element{    public Value (String id){     super(id);    } } public class CanonicalMapping {    public static void main(String[] args){     int size=1000;     Key[] keys=new Key[size];     WeakHashMap<Key,Value> map=new WeakHashMap<Key,Value>();     for(int i=0;i<size;i++){       Key k=new Key(Integer.toString(i));       Value v=new Value(Integer.toString(i));       if(i%3==0)         keys[i]=k;       map.put(k, v);     }     System.gc();    } }

从打印结果可以看出,当执行System.gc()方法后,垃圾回收器 只会回收那些仅仅持有弱引用的Key对象。id可以被3整除的Key对 象持有强引用,因此不会被回收。

Java中对象的强、软、弱和虚引用(5)

时间:2011-03-24 zhangjunhd

4.3用 WeakHashMap 堵住泄漏

在 SocketManager 中防止泄漏很容易,只要用 WeakHashMap 代替 HashMap 就行了。(这里假定SocketManager不需要线程安全 )。当映射的生命周期必须与键的生命周期联系在一起时,可以使 用这种方法。用WeakHashMap修复 SocketManager。

public class SocketManager {    private Map<Socket,User> m = new WeakHashMap<Socket,User>();    public void setUser(Socket s, User u) {      m.put(s, u);    }    public User getUser(Socket s) {      return m.get(s);    } }

4.4配合使用引用队列

WeakHashMap 用弱引用承载映射键,这使得应用程序不再使用 键对象时它们可以被垃圾收集,get() 实现可以根据 WeakReference.get() 是否返回 null 来区分死的映射和活的映射 。但是这只是防止 Map 的内存消耗在应用程序的生命周期中不断 增加所需要做的工作的一半,还需要做一些工作以便在键对象被收 集后从 Map 中删除死项。否则,Map 会充满对应于死键的项。虽 然这对于应用程序是不可见的,但是它仍然会造成应用程序耗尽内 存。

引用队列是垃圾收集器向应用程序返回关于对象生命周期的信 息的主要方法。弱引用有个构造函数取引用队列作为参数。如果用 关联的引用队列创建弱引用,在弱引用对象成为 GC 候选对象时, 这个引用对象就在引用清除后加入到引用队列中(具体参考上文软 引用示例)。

WeakHashMap 有一个名为 expungeStaleEntries() 的私有方法 ,大多

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号