java 软引用和弱引用

软引用(SoftReference)

软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。下面是一个使用示例:

List list = new ArrayList<>();
list.add("111");
list.add("112");
list.add("113");
list.add("114");
list.add("115");

ReferenceQueue> queue = new ReferenceQueue<>();
SoftReference> softReference = new SoftReference>(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 list = new ArrayList<>();
list.add("111");
list.add("112");
list.add("113");
list.add("114");
list.add("115");


ReferenceQueue> queue = new ReferenceQueue<>();
WeakReference> weakReference = new WeakReference>(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)