java 软引用和弱引用

本文介绍了Java中软引用(SoftReference)与弱引用(WeakReference)的概念及使用方法。软引用适用于创建缓存,当内存不足时会被回收;弱引用则在下一次垃圾回收时必定被回收,两者均可与引用队列结合使用以清理空引用。
软引用(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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值