快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
引用,于是对象5是一个软可及对象。

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

时间:2011-03-24 zhangjunhd

3.使用软引用构建敏感数据的缓存

3.1 为什么需要使用软引用

首先,我们看一个雇员信息查询系统的实例。我们将使用一个 Java语言实现的雇员信息查询系统查询存储在磁盘文件或者数据库 中的雇员人事档案信息。作为一个用户,我们完全有可能需要回头 去查看几分钟甚至几秒钟前查看过的雇员档案信息(同样,我们在 浏览WEB页面的时候也经常会使用“后退”按钮)。这时我们通常会 有两种程序实现方式:一种是把过去查看过的雇员信息保存在内存 中,每一个存储了雇员档案信息的Java对象的生命周期贯穿整个应 用程序始终;另一种是当用户开始查看其他雇员的档案信息的时候 ,把存储了当前所查看的雇员档案信息的Java对象结束引用,使得 垃圾收集线程可以回收其所占用的内存空间,当用户再次需要浏览 该雇员的档案信息的时候,重新构建该雇员的信息。很显然,第一 种实现方法将造成大量的内存浪费,而第二种实现的缺陷在于即使 垃圾收集线程还没有进行垃圾收集,包含雇员档案信息的对象仍然 完好地保存在内存中,应用程序也要重新构建一个对象。我们知道 ,访问磁盘文件、访问网络资源、查询数据库等操作都是影响应用 程序执行性能的重要因素,如果能重新获取那些尚未被回收的Java 对象的引用,必将减少不必要的访问,大大提高程序的运行速度。

3.2 如果使用软引用

SoftReference的特点是它的一个实例保存对一个Java对象的软 引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。 也就是说,一旦SoftReference保存了对一个Java对象的软引用后 ,在垃圾线程对这个Java对象回收前,SoftReference类所提供的 get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该 Java对象之后,get()方法将返回null。

看下面代码:

MyObject aRef = new MyObject(); SoftReference aSoftRef=new SoftReference (aRef);

此时,对于这个MyObject对象,有两个引用路径,一个是来自 SoftReference对象的软引用,一个来自变量aReference的强引用 ,所以这个MyObject对象是强可及对象。

随即,我们可以结束aReference对这个MyObject实例的强引 用:

aRef = null;

此后,这个MyObject对象成为了软可及对象。如果垃圾收集线 程进行内存垃圾收集,并不会因为有一个SoftReference对该对象 的引用而始终保留该对象。Java虚拟机的垃圾收集线程对软可及对 象和其他一般Java对象进行了区别对待:软可及对象的清理是由垃 圾收集线程根据其特定算法按照内存需求决定的。也就是说,垃圾 收集线程会在虚拟机抛出OutOfMemoryError之前回收软可及对象, 而且虚拟机会尽可能优先回收长时间闲置不用的软可及对象,对那 些刚刚构建的或刚刚使用过的“新”软可反对象会被虚拟机尽可能 保留。在回收这些对象之前,我们可以通过:

MyObject anotherRef=(MyObject)aSoftRef.get ();

重新获得对该实例的强引用。而回收之后,调用get()方法就只 能得到null了。

3.3 使用ReferenceQueue清除失去了软引用对象的 SoftReference

作为一个Java对象,SoftReference对象除了具有保存软引用的 特殊性之外,也具有Java对象的一般性。所以,当软可及对象被回 收之后,虽然这个SoftReference对象的get()方法返回null,但这 个SoftReference对象已经不再具有存在的价值,需要一个适当的 清除机制,避免大量SoftReference对象带来的内存泄漏。在 java.lang.ref包里还提供了ReferenceQueue。如果在创建 SoftReference对象的时候,使用了一个ReferenceQueue对象作为 参数提供给SoftReference的构造方法,如:

ReferenceQueue queue = new ReferenceQueue()

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