1、强引用(Strong Reference)
People p=new People();
p=null;
- 经常使用的创建一个对象就是强引用。如果对象是一个强引用,JVM绝对不会回收,如果内存满了则抛出OutOfMemoryError异常
- 只有当对象为null时,GC会回收
2、软引用
- 源码,构造器
public class SoftReference<T> extends Reference<T> {
public SoftReference(T referent) {
super(referent);
this.timestamp = clock;
}
}
- 因此,SoftReference是把想要声明的对象引用当作参数传入构造器,其类通过泛型约束,最终得到目标对象引用的软引用
SoftReference<People> soft=new SoftReference<>(new People());
- 如果JVM内存充足,无论多少次GC,软引用指向的对象都不会被回收,如果JVM内存满了,软引用就会被回收
- 软引用没有被回收则可以一直被访问,目前的一些缓存就是这种方法
3、弱引用
- 其源码与软引用类似
public class WeakReference<T> extends Reference<T> {
public WeakReference(T referent) {
super(referent);
}
}
- 只要GC,则弱引用对象就会被回收,其生命周期最多就两次GC的间隔时间
4、虚引用
-
无法通过虚引用获得一个对象实例
-
在对象被收集器回收时收到一个系统通知。 当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,将这个虚引用加入引用队列,在其关联的虚引用出队前,不会彻底销毁该对象。 所以可以通过检查引用队列中是否有相应的虚引用来判断对象是否已经被回收了。
-
如果一个对象没有强引用和软引用,对于垃圾回收器而言便是可以被清除的,在清除之前,会调用其finalize方法,如果一个对象已经被调用过finalize方法但是还没有被释放,它就变成了一个虚可达对象。
-
与软引用和弱引用不同,显式使用虚引用可以阻止对象被清除,只有在程序中显式或者隐式移除这个虚引用时,这个已经执行过finalize方法的对象才会被清除。想要显式的移除虚引用的话,只需要将其从引用队列中取出然后扔掉(置为null)即可