Java中对象的强、软、弱和虚引用 - 编程入门网
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 zhangjunhd4.使用弱引用构建非敏感数据的缓存 4.1全局 Map 造成的内存泄漏 无意识对象保留最常见的原因是使用Map将元数据与临时对象( transient object)相关联。假定一个对象具有中等生命周期,比 分配它的那个方法调用的生命周期长,但是比应用程序的生命周期 短,如客户机的套接字连接。需要将一些元数据与这个套接字关联 ,如生成连接的用户的标识。在创建Socket时是不知道这些信息的 ,并且不能将数据添加到Socket对象上,因为不能控制 Socket 类 或者它的子类。这时,典型的方法就是在一个全局 Map 中存储这 些信息,如下面的 SocketManager 类所示:使用一个全局 Map 将 元数据关联到一个对象。
这种方法的问题是元数据的生命周期需要与套接字的生命周期 挂钩,但是除非准确地知道什么时候程序不再需要这个套接字,并 记住从 Map 中删除相应的映射,否则,Socket 和 User 对象将会 永远留在 Map 中,远远超过响应了请求和关闭套接字的时间。这 会阻止 Socket 和 User 对象被垃圾收集,即使应用程序不会再使 用它们。这些对象留下来不受控制,很容易造成程序在长时间运行 后内存爆满。除了最简单的情况,在几乎所有情况下找出什么时候 Socket 不再被程序使用是一件很烦人和容易出错的任务,需要人 工对内存进行管理。 4.2如何使用WeakHashMap 在 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |