定义:
强引用:new出来的,比如String str = new String(“hello”)。对象上有强引用不会被回收。
软引用:SoftReference<String> softRef = new SoftReference<String>(str);(其中str是引用)。如果只有软引用,而且当虚拟机堆内存不够时候会回收。
弱引用:WeakReference<String> weakRef = new WeakReference<String>(str); WeakHashMap。如果只有弱引用,而且当虚拟机堆内存不够时候会回收。
public class ReferenceDemo {
public static void main(String[] args) {
// 强引用
String str=new String("abc");
// 软引用
SoftReference<String> softRef=new SoftReference<String>(str);
str = null; // 去掉强引用
System.gc(); // 垃圾回收器进行回收
System.out.println(softRef.get());
// 强引用
String abc = new String("123");
// 弱引用
WeakReference<String> weakRef=new WeakReference<String>(abc);
abc = null; // 去掉强引用
System.gc(); // 垃圾回收器进行回收
System.out.println(weakRef.get());
}
}
输出:
abc
null
HashMap,WeakHashMap
public class WeakHashMapDemo {
public static void main(String[] args) throws Exception {
String a = new String("a");
String b = new String("b");
Map weakmap = new WeakHashMap();
Map map = new HashMap();
map.put(a, "aaa"); //a上有String和HashMap的强引用
map.put(b, "bbb"); //b上有String和HashMap的强引用
weakmap.put(a, "aaa"); //再给a加上弱引用
weakmap.put(b, "bbb"); //再给b加上弱引用
map.remove(a); //撤销a上HashMap的强引用
a=null; //撤销a上String的强引用,a上只有弱引用
b=null; //撤销b上String的强引用,b上有HashMap的强引用和弱引用
System.gc(); //垃圾回收
Iterator i = map.entrySet().iterator();
while (i.hasNext()) {
Map.Entry en = (Map.Entry)i.next();
System.out.println("map:"+en.getKey()+":"+en.getValue());
}
Iterator j = weakmap.entrySet().iterator();
while (j.hasNext()) { //a上没有强引用,只有弱引用,会自动回收
Map.Entry en = (Map.Entry)j.next();
System.out.println("weakmap:"+en.getKey()+":"+en.getValue());
}
}
}
输出:
map:b:bbb
weakmap:b:bbb
具体案例讲述软引用的用法:
博客管理系统中,用缓存的方式存储点击过的博文。定义类型为HashMap<String,SoftReference<Content>>的对象类缓存博文,key是文章ID,值是指向Content的软引用。在用户再次点击某篇文章时,先在缓存中的HashMap查找key存在value不为空,没有再去数据库找。如果JVM内存空间够,可以通过缓存提升性能,如果不够,会释放软引用的缓存,最多影响性能,不影响功能。
具体案例讲述弱引用的用法:
电商项目中需要保存优惠券Conpon和所有用户的对应关系。数据结构:WeakHashMap<Coupon, List<WeakReference<User>>>。key是优惠券,value是指向用户列表的弱引用。假设优惠券coupon3对应100个用户,那么每个user对象上有包含用户信息的userList上强引用和上述结构里的弱引用不会回收。
当用户user1注销后,userList会删除该对象。他只有优惠券和用户关系表上的弱引用,会被自动回收。优惠券-用户关系自动更新,无需干预。(最大的优势:自动更新对应关系)
总结:
1.通过JVM结构,GC流程或者代码层面JVM调优等引出
2.叙述软引用和弱引用的定义方式
3.说明二者的回收方式
4.结合案例说明用法