响应式网站怎么做/俄罗斯搜索引擎入口
JDK1.2 之前,一个对象只有“已被引用”和"未被引用"两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。
为此,在Java SE 2中引入四种强度不同的引用。从强到弱它们分别是:StrongReference(强引用),SoftReference(软引用),WeakReference(弱引用),PhantomReference(虚引用)。
我们先看看这4类引用的区别:

那WeakReference一定会在gc中被回收吗?
下面我们看个例子
public static void main(String[] args) { User user = new User("ganhuojun"); WeakReference weakReference = new WeakReference(user); System.gc();//主动gc User res = weakReference.get(); String name = res.getName(); System.out.println(name);}
注:User类只有一个String的name成员变量,不再贴出。
运行结果如下,我们发现可以正常获取到弱引用,并输出,因此我们得出一个结论,并没有被回收。
ganhuojunProcess finished with exit code 0
目前现象与官方结论不一致,这是为什么?
接下来,我们重新回到上述代码中,weakReference的是一个弱引用,但我们忽略了一个问题,user是一个强引用,由于强引用不会被垃圾回收,导致weakReference的作用失效。
为了验证,我们修改下代码
public static void main(String[] args) { WeakReference weakReference = new WeakReference(new User("ganhuojun")); System.gc(); User user = weakReference.get(); String name = user.getName(); System.out.println(name);
此时执行结果如下,发现user已经被gc回收。
Exception in thread "main" java.lang.NullPointerExceptionat com.hirano.li.battery.Test.main(Test.java:19)Process finished with exit code 1
弱引用到底有什么用
Java常通过使用弱引用来避免内存泄漏,例如官方JDK中有一种内存变量ThreadLocal。
最后,如果我们使用第一种例子的这种不合理的写法,那么无达到我们想要的效果,使用弱引用一定不能在其中存在强引用的变量,只有正确的使用,才能保证一定会被gc回收。