快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
gt;();    }    // 取得缓存器实例    public static EmployeeCache getInstance() {     if (cache == null) {       cache = new EmployeeCache();     }     return cache;    }    // 以软引用的方式对一个Employee对象的实例进行引用并 保存该引用    private void cacheEmployee(Employee em) {     cleanCache();// 清除垃圾引用     EmployeeRef ref = new EmployeeRef(em, q);     employeeRefs.put(em.getID(), ref);    }    // 依据所指定的ID号,重新获取相应Employee对象的实例    public Employee getEmployee(String ID) {     Employee em = null;     // 缓存中是否有该Employee实例的软引用,如果有,从 软引用中取得。     if (employeeRefs.containsKey(ID)) {       EmployeeRef ref = (EmployeeRef) employeeRefs.get(ID);       em = (Employee) ref.get();     }     // 如果没有软引用,或者从软引用中得到的实例是null ,重新构建一个实例,     // 并保存对这个新建实例的软引用     if (em == null) {       em = new Employee(ID);       System.out.println("Retrieve From EmployeeInfoCenter. ID=" + ID);       this.cacheEmployee(em);     }     return em;    }    // 清除那些所软引用的Employee对象已经被回收的 EmployeeRef对象    private void cleanCache() {     EmployeeRef ref = null;     while ((ref = (EmployeeRef) q.poll()) != null) {       employeeRefs.remove(ref._key);     }    }    // 清除Cache内的全部内容    public void clearCache() {     cleanCache();     employeeRefs.clear();     System.gc();     System.runFinalization();    } }

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

时间:2011-03-24 zhangjunhd

4.使用弱引用构建非敏感数据的缓存

4.1全局 Map 造成的内存泄漏

无意识对象保留最常见的原因是使用Map将元数据与临时对象( transient object)相关联。假定一个对象具有中等生命周期,比 分配它的那个方法调用的生命周期长,但是比应用程序的生命周期 短,如客户机的套接字连接。需要将一些元数据与这个套接字关联 ,如生成连接的用户的标识。在创建Socket时是不知道这些信息的 ,并且不能将数据添加到Socket对象上,因为不能控制 Socket 类 或者它的子类。这时,典型的方法就是在一个全局 Map 中存储这 些信息,如下面的 SocketManager 类所示:使用一个全局 Map 将 元数据关联到一个对象。

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

这种方法的问题是元数据的生命周期需要与套接字的生命周期 挂钩,但是除非准确地知道什么时候程序不再需要这个套接字,并 记住从 Map 中删除相应的映射,否则,Socket 和 User 对象将会 永远留在 Map 中,远远超过响应了请求和关闭套接字的时间。这 会阻止 Socket 和 User 对象被垃圾收集,即使应用程序不会再使 用它们。这些对象留下来不受控制,很容易造成程序在长时间运行 后内存爆满。除了最简单的情况,在几乎所有情况下找出什么时候 Socket 不再被程序使用是一件很烦人和容易出错的任务,需要人 工对内存进行管理。

4.2如何使用WeakHashMap

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号