软引用和弱引用对内存性能的帮助
先了解一下什么是强引用
比如new一个对象 String a = new String("abc");
其中a为强引用。
软引用(SoftReference):
如果一个对象只具有软引用,而当前虚拟机堆内存空间足够,那么垃圾回收器就不会回收它,反之就会回收这些软引用所指向的对象。
弱引用(WeakReference):
垃圾回收器一旦发现某块内存上只有弱引用,不管当前内存空间是否足够,那么都会回收这块内存。
public static void main(String[] args) {
String str = new String("abc"); //强引用
SoftReference<String> soft = new SoftReference<String>(str);//软引用
str = null; //去掉强引用
System.gc();//垃圾回收
System.out.println(soft.get());
String abc = new String("123");
WeakReference<String> weak = new WeakReference<String>(abc);//弱引用
abc = null;//去掉强引用
System.gc();//垃圾回收
System.out.println(weak.get());
}
}
输出 的答案是
软引用的使用场景:
使用强引用指向博文对象Content,而软引用做缓存。用
HashMap<String,SoftReference<Content>>
来保存缓存内容。
Key:String类型,保存文章ID
Value:是一个指向content的软引用
作用:当用户浏览博文,通过id找content,当有对应的value,直接返回;如果没有或者为空时,再操作数据库,再插到缓存中。需要删除强引用,只保留软引用,当内存空间不足会渐渐释放软引用内存。
对比:如果用强引用来做缓存,由于我们不知道什么时候该撤销在content上的强引用,使用我们找不到一个合适的机会来释放缓存,and如果我们在引入一套缓存机制就是额外的工作了,就没有软引用这么直接方便了。
弱引用使用场景:
coupon优惠卷指向对应的用户,而用户又绑定的有强引用和弱引用。
WeakHashMap<Coupon,List<WeakReference<User>>
基于弱引用的hashmap,
key:coupon
value:List<WeakReference<User>>
当某个用户注销了账号,即强引用为null时,软引用就会在下次垃圾回收时被回收,即100个用户会自动更新为99个
如果我们不用弱引用而用强引用,那么在用户被删除之后,需要手动删除用户和优惠卷之间的对应关系。