相关链接
Java:强引用,软引用,弱引用和虚引用
一次性把Java的四种引用说清楚!
强引用
eg: Object object= new Object();
这种方式就是强引用,强引用在gc root可达的时候都不会被jvm回收,即使抛出OutOfMemoryError。
软引用(适合用来做缓存)
eg:
Object object= new Object();
SoftReference softReference = new SoftReference<>(object);
Object result = softReference.get();
通过SoftReference的get方法来获取对象。软引用,只有在jvm内存不足的情况下会被回收。
弱引用
eg:
Object object= new Object();
WeakReference weakReference= new WeakReference<>(object);
Object result = weakReference.get();
通过WeakReference的get方法来获取对象。在gc的时候就会被回收,不管内存是否充足。
使用场景
如果一个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么应该用 Weak Reference 来记住此对象。或者想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候就应该用弱引用,这个引用不会在对象的垃圾回收判断中产生任何附加的影响。
虚引用
eg:
Object object= new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(object, queue);
虚引用和没有引用是一样的,需要和队列(ReferenceQueue)联合使用。当jvm扫描到虚引用的对象时,会先将此对象放入关联的队列中,因此我们可以通过判断队列中是否存这个对象,来进行回收前的一些处理。