弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在 java 中,用 java.lang.ref.WeakReference 类来表示。下面是使用示例:
public class test {
public static void main(String[] args) {
WeakReference<People>reference=new WeakReference<People>(new People("zhouqian",20));
System.out.println(reference.get());
System.gc();//通知GVM回收资源
System.out.println(reference.get());
}
}
class People{
public String name;
public int age;
public People(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "[name:"+name+",age:"+age+"]";
}
}
输出结果:
> [name:zhouqian,age:20]
> null
第二个输出结果是 null,这说明只要 JVM 进行垃圾回收,被弱引用关联的对象必定会被回收掉。不过要注意的是,这里所说的被弱引用关联的对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象(软引用也是如此)。比如:将代码做一点小更改:
public class test {
public static void main(String[] args) {
People people=new People("zhouqian",20);
WeakReference<People>reference=new WeakReference<People>(people);//<span>关联强引用</span>
System.out.println(reference.get());
System.gc();
System.out.println(reference.get());
}
}
class People{
public String name;
public int age;
public People(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "[name:"+name+",age:"+age+"]";
}
} // 结果发生了很大的变化
[name:zhouqian,age:20]
[name:zhouqian,age:20]
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被 JVM 回收,这个弱引用就会被加入到与之关联的引用队列中。

