1、强引用:只要某个对象有强引用与其关联,JVM一定不会回收这个对象。
A a = new A();
a = null;
A对象会被回收。但是有时我们不希望A对象立即被回收,可能在不久的将来还会用到(缓存)。这时候就需要软引用了
2、软引用:用来描述有用但非必需的对象,只有在内存不足时才会被JVM回收。适合缓存场景
A a = new A();
SoftReference softA = new SoftReference(a);
a = null;
此时A对象不会被立即回收,只有在内存不足时才会被回收。
3、弱引用:用来描述非必需对象的,当JVM进行垃圾回收时,会被立即回收。
A a = new A();
B b = new B(a);
a = null;
GC时,A对象不会被回收,因为还在被B引用。但此时A对象已经无用了,需要将其回收,否则就会造成内存泄漏。
使用弱引用
A a = new A();
WeakReference weakA = new WeakReference(a)
B b = new B(weakA);
a = null;
GC时,A对象会被立即回收。
4、虚引用:不影响对象的生命周期。在任何时候都可能被垃圾回收器回收。主要用于检测对象是否已经从内存中删除。
A a= new A();
PhantomReference phA= new PhantomReference(obj);
a=null;
phA.get();//永远返回null
phA.isEnQueued();//返回是否从内存中已经删除
5、ReferenceQueue
一个引用队列,可以监控被回收的Reference对象,具体的就是当一个Reference引用对象所引用的值被回收了,那么JVM就会把这个Reference引用添加到这个队列里面。
软引用、弱引用中,会在对象被回收后将Reference引用对象(SoftReference ,WeakReference )加入ReferenceQueue队列,通过观察ReferenceQueue,可得知对象在何时被回收了以及在对象被回收后做一些事(Weakhashmap)。
虚引用的构造方法中必须传入ReferenceQueue,在对象被回收前将PhantomReference对象加入ReferenceQueue中,通过观察ReferenceQueue,可以在对象被回收前做一些事。
参考: