什么是弱引用
如果一个对象具有弱引用(WeakReference),那么当GC线程扫描的过程中一旦发现某个对象只具有弱引用而不存在强引用时不管当前内存空间足够与否GC都会回收它的内存。由于垃圾回收器是一个优先级较低的线程,所以不一定会很快发现那些只具有弱引用的对象。为了防止内存溢出,在处理一些占用内存大而且生命周期较长的对象时候,可以尽量使用软引用和弱引用。
抽象化具体
我们通过学校、老师、代课老师的关系来介绍
// 学校类 继承了WeakReference,引用对象是Teacher
public class School extends WeakReference<Teacher> {
String name = "清华大学";
public School(Teacher referent) {
super(referent);
}
public School(Teacher referent,String name) {
super(referent);
this.name = name;
}
}
//教师类
public class Teacher {
//
String name;
Teacher() {}
Teacher(String name) {
this.name = name;
}
}
//接下来实测试
public class Test {
public static void main(String[] args) {
//我们把强引用比作老师的工牌,而代课老师没有工牌
//张三的定义就是强引用 teacher就是他的工牌
Teacher teacher = new Teacher("张三");
//我们假设张三生病了 从外面请来了李四教授 因为是临时请过来的所以没有工牌 也就是直接new
School school = new School(new Teacher("李四"));
//通过WeakReference的get()方法获取引用教师信息 这个时候我们获取到的信息就是李四
System.out.println("current teacher :" + school.get().name);
//在一个对象只有弱引用的时候 会被gc掉
//可以理解为李四上完课了
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//下课后我们再看下 李四老师是不是还存在
if (school.get() == null) {
System.err.println("李四老师因为是外聘老师,已经上完课回家了!!!");
}else {
System.out.println("李四老师竟然还想继续上体育课,怎么可能!!!");
}
//我们要理解弱引用对象 和被弱引用对象
//弱引用对象就是我们的学校 gc过后只有被弱引用对象 也就是teacher被回收了 school没有被回收
//很多同学对这个位置的理解不对
System.out.println("学校名称" + school.name);
//不管了
//张三老师要回来上课了
//因为我们没有使用弱引用队列 所以直接新创建一个引用对象
school = new School(teacher);
System.out.println("current teacher :" + school.get().name);
//这个时候张三老师上课完成了 因为张三老师有工牌(强引用),所以不会被回收
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//下课后我们再看下 张三老师是不是还存在
if (school.get() == null) {
System.err.println("张三老师竟然被开除了!!!!");
}else {
System.out.println("张三老师还在,大家不必担心");
}
}
}
current teacher :李四
李四老师因为是外聘老师,已经上完课回家了!!!
学校名称清华大学
current teacher :张三
张三老师还在,大家不必担心