Java笔记3.4--软引用弱引用在JVM中调优

定义:

强引用: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.结合案例说明用法

猜你喜欢

转载自blog.csdn.net/lfanchenyu/article/details/107682383