一、强引用
1 | 最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。 |
二、软引用
1 | 一种相对强引用弱化了一些的引用,需要java.lang.ref.SoftReference类来实现,可以让对象豁免一些垃圾收集。 |
案例:
1 | 假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取则会严重影响性能,如果一次性全部加载到内存中有可能造成内存溢出 |
三、弱引用
1 | 需要java.lang.ref.WeakReference类来实现。 |
案例:
1 | ThreadLocal<M> tl = new ThreadLocal<>(); |
四、虚引用
1 | 需要java.lang.ref.PhantomRefrnce类来实现,如果一个对象仅持有虚引用,那么它和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 |
案例:
1 | NIO有个DirectByteBuffer是用来操作堆外内存的,堆外内存由操作系统管理,gc无法回收,当DirectByteBuffer为null时,可以通过虚引用的方式检测到,此时Reference<? extends M> poll = QUEUE.poll();可以获得GC回收的通知,进而去执行自定义的逻辑清理堆外内存。 |