前言
Java中有强软弱虚四种引用。
强引用(Strong Reference)
正常用new声明的对象都是强引用。
强引用不会被垃圾回收。
软引用(Soft Reference)
使用方法:
1
SoftReference<Object> m = new SoftReference<>(obj);
特性:只有系统内存不够用时,被软引用指向的对象才会被回收。
使用场景:memory cache
弱引用(Weak Reference)
使用方法:
1
WeakReference<Object> m = new WeakReference<>(obj);
特性:如果只有弱引用,只要遭遇垃圾回收,就会被回收。
使用场景:
- WeakHashMap
- ThreadLocal:
- ThreadLocal中的ThreadLocalMap的key就WeakReference
- 由于ThreadLocalMap是Thread类的成员,因此其生命周期是和Thread相同的,该map中的key是ThreadLocal实例,如果某个ThreadLocal实例用完不用了,但由于map中还有对该实例的引用,因此,GC不会回收该对象,就会导致内存泄露,而使用弱引用之后,当外部的强引用消失之后,只剩弱引用,就会被回收了。
- ThreadLocalMap中的value还是强引用,因此如果ThreadLocal不用了,还是要调用remove()方法。
虚引用(Phantom Reference)
使用方法:
1
PhantomReference<Obj> m = new PhantomReference<>(obj, QUEUE);
特性:
- 如果只有虚引用,只要遭遇垃圾回收,就会被回收,回收后,QUEUE中会放入此对象
- 检查QUEUE就能知道虚引用指向的对象是否被回收
应用:用于管理堆外内存(Direct Memory)