软引用(SoftReference)
运行结果:
软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例:
List<String> list = new ArrayList<>();
list.add("111");
list.add("112");
list.add("113");
list.add("114");
list.add("115");
ReferenceQueue<List<String>> queue = new ReferenceQueue<>();
SoftReference<List<String>> softReference = new SoftReference<List<String>>(list, queue);
// 接触强引用 现在只剩下软引用
list = null;
System.out.println(softReference.get());
System.gc();
System.out.println(softReference.get());
// 软引用可以和一个软用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
// ReferenceQueue 就是用来清理这些空引用的
// 清理 SoftReference
while(queue.poll() != null){
// 清理工作
System.out.println("clear");
}运行结果:
[111, 112, 113, 114, 115]
[111, 112, 113, 114, 115]
弱引用(WeakReference)
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。下面是使用示例:
List<String> list = new ArrayList<>();
list.add("111");
list.add("112");
list.add("113");
list.add("114");
list.add("115");
ReferenceQueue<List<String>> queue = new ReferenceQueue<>();
WeakReference<List<String>> weakReference = new WeakReference<List<String>>(list, queue);
list = null;
System.out.println(weakReference.get());
System.gc();
System.out.println(weakReference.get());
// 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
// ReferenceQueue 就是用来清理这些空引用的
// 清理 WeakReference
while(queue.poll() != null){
// 清理工作
System.out.println("clear");
}运行结果:
[111, 112, 113, 114, 115]
null
clear
本文介绍了Java中软引用(SoftReference)与弱引用(WeakReference)的概念及使用方法。软引用适用于创建缓存,当内存不足时会被回收;弱引用则在下一次垃圾回收时必定被回收,两者均可与引用队列结合使用以清理空引用。

1179

被折叠的 条评论
为什么被折叠?



