在Java中有4种引用,分别是强、软、弱、虚,现在就讨论其中的弱引用WeakReference。弱引用是指垃圾回收器一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
在了解它的定义后我们可以看下面两段代码:
public class WeakTest {
public static void main(String[] args) throws InterruptedException {
A a = new A(3);
WeakReference<A> wk = new WeakReference<A>(a);
System.out.println(wk.get());
System.gc();
Thread.sleep(1000);
System.out.println(wk.get());
}
}
public class WeakTest {
public static void main(String[] args) throws InterruptedException {
WeakReference<A> wk = new WeakReference<A>(new A(3));
System.out.println(wk.get());
System.gc();
Thread.sleep(1000);
System.out.println(wk.get());
}
}
其中类A的定义如下:
class A {
private int num;
A(int num) {
this.num = num;
}
@Override
public String toString() {
return "A{" +
"num=" + num +
'}';
}
}
这两段程序都是先创建一个弱引用并将它打印出来,然后进行垃圾回收后再次打印弱引用的对象,请问这两段程序的运行结果一样吗?
如果你了解弱引用,就会知道这两段程序的输出值是不同的。第一段程序的对象A
在调用gc后并没有被回收,原因是有一个强引用a
指向了这个创建的对象,而第二个程序回收了,因为在调用gc时,只有弱引用wk
指向该对象,所以它就在调用gc后就立刻被回收了。