先占个坑,今天因为项目需求所以想到了java中的弱引用特性。
首先什么是弱引用?
Object a = new Object();
Object b = a;
比如上面的代码,b就是a的强引用。当我们对a变量进行修改时,b对应的也会发生变化。并且当GC想要回收a变量所占用的内存时,会因为b持有了a的强引用,导致对a的内存回收失败,进而导致内存泄漏。
所谓弱引用,就是用来解决这个问题的。
Object tmp = new Object();
WeakReference<Object> weakReference = new WeakReference<>(tmp);
weakReference.get();//如果此方法为空,说明tmp已经被GC回收
上方的代码就是典型的弱引用使用示例。当我们使用weakReference.get()(弱引用)访问对象时,可以获得与强引用一样的效果,但当tmp对象需要被GC回收时,不会因为weakReference持有tmp的引用而导致回收失败。
weakReference.get()返回的是tmp的弱引用,我们可以对它的操作和使用一般的强引用是一模一样的。唯一的区别就是当tmp被gc回收后,weakReference.get()会返回null。
也正因为如此,弱引用常常用于缓存处理。
PS:另外再记录一下,我写弱引用demo的时候,学到了java中String类型的特殊性
int param = 10;
String str1 = "abc";
String str2 = new String("abc");
str1与str2是内容一样的String类型变量。但str1的声明方式导致了str1的值是存储在常量池中的,就如同变量param一样,它并不是一个对象。而str2则是通过new关键字声明的,在java中,str2才是一个真正“对象”。只有这类“对象”才能被弱引用,常量池中的变量是不存在弱引用的概念的