网站导航:首页 -> JAVA认证 -> JAVA认证考试指导 -> Java理论和实践:用软引用阻止内存泄漏(2)

Java理论和实践:用软引用阻止内存泄漏(2)

通过使用一个软引用来管理高速缓存的缓冲区,可以解决 leakychecksum 中的问题,如清单 2 所示。现在,只要不是特别需要内存,缓冲区就会被保留,但是在需要时,也可被垃圾收集器回收:


清单 2. 用软引用修复 leakychecksum
public class cachingchecksum {    private softreference bufferref;        public synchronized int getfilechecksum(string filename) {        int len = getfilesize(filename);        byte[] bytearray = bufferref.get();        if (bytearray == null || bytearray.length < len) {            bytearray = new byte[len];            bufferref.set(bytearray);        }        readfilecontents(filename, bytearray);        // calculate checksum and return it    }}

一种廉价的缓存

cachingchecksum 使用一个软引用来缓存单个对象,并让 jvm 处理从缓存中取走对象时的细节。类似地,软引用也经常用于 gui 应用程序中,用于缓存位图图形。是否可使用软引用的关键在于,应用程序是否可从大量缓存的数据恢复。

如果需要缓存不止一个对象,您可以使用一个 map,但是可以选择如何使用软引用。您可以将缓存作为 map> 或 softreference> 管理。后一种选项通常更好一些,因为它给垃圾收集器带来的工作更少,并且允许在特别需要内存时以较少的工作回收整个缓存。弱引用有时会错误地用于取代软引用,用于构建缓存,但是这会导致差的缓存性能。在实践中,弱引用将在对象变得弱可及之后被很快地清除掉 —— 通常是在缓存的对象再次用到之前 —— 因为小的垃圾收集运行得很频繁。

对于在性能上非常依赖高速缓存的应用程序来说,软引用是一个不管用的手段,它确实不能取代能够提供灵活终止期、复制和事务型高速缓存的复杂的高速缓存框架。但是作为一种 “廉价(cheap and dirty)” 的高速缓存机制,它对于降低价格是很有吸引力的。

正如弱引用一样,软引用也可创建为具有一个相关的引用队列,引用在被垃圾收集器清除时进入队列。引用队列对于软引用来说,没有对弱引用那么有用,但是它们可以用于发出管理警报,说明应用程序开始缺少内存。