1.强引用类型
这种类型指的是平时使用时直接用new的方式获得的对象,并有一个指针对其引用。在这种情况下,只要这个引用不断,不主动中断。这个对象永远也不会被回收。
public class LL {
public static void main(String[] args) {
LL ll = new LL();
ll = null;
}
}
这个引用其实可以抽象为一条引线,用这条引线牵引对象。在强引用中,只要这条引线存在,那么对象永远不会被回收。
2.软引用类型
这种类型指的也是一种引线,不过这种引线在内存不足的时候会被GC强制切断。不过这种引用类型不会在内存不够的时候直接就进行回收。GC会首先执行一次,回收一波垃圾。如果剩余的内存还是不够,才会回收这一部分软引用类型的对象。也就是这部分对象进行的是二次回收。
public class LL {
public static void main(String[] args) {
LL ll = new LL();
SoftReference<LL> srf = new SoftReference<>(ll);
ll = null;
}
}
代码的第5行执行的目的是断开这条强引用的链条。仅仅保留弱引用的链条。
3.弱引用
同样,也可以认为是一条引线。不过这种引线更弱,只要JVM进行了垃圾回收。这条引线就会被断开。
public class LL {
public static void main(String[] args) {
LL ll = new LL();
WeakReference<LL> wref = new WeakReference<>(ll);
ll = null;
}
}
4.虚引用
这个引线的作用更小,甚至通过这个引线拿不到对应的对象。看如下代码
public class LL {
public static void main(String[] args) {
LL ll = new LL();
ReferenceQueue<LL> llqueue = new ReferenceQueue<>();
PhantomReference<LL> llPhantomReference = new PhantomReference<LL>(ll,llqueue);
System.out.println(llPhantomReference.get());
ll = null;
}
}
这玩意没啥实际意义。主要的用途就是这个对象被回收的时候,起到一个通知的作用。这个ReferenceQueue对象就是这个对象临近被销毁的时候所进入的队列。