java中得四种引用
Java中有四种引用类型:强引用、软引用、弱引用、虚引用
- 强引用
我们代码中常写,如: Object() obj = new Object();
强引用对象永远不会被JVM回收,即使最终OOM,可手动中断,将其致为null,对象则被回收,可通过重写finalize方法验证,实际开发中,一定不要重写finalize方法
- 软引用
创建一个软引用
SoftReference<Demo> demoSoftReference = new SoftReference<Demo>(new Demo());
软引用通过SoftReference进行申明,通过泛型将对象包裹,当我们需要从软引用对象获取泛型对象时,通过get进行获取。
Demo demo = demoSoftReference .get();
为什么会有软引用呢?
我们先从它得特点谈一谈,程序在运行内存不足时,会触发JVM得GC操作,如果GC过后,内存依旧不足,怎么办呢?此时JVM就会把软引用中得对象kill掉(内存不足,JVM才会回收此类对象,内存足够得情况下,手动GC也不会进行该对象的回收操作),发挥你的想象,是不是想到了什么有趣得场景(项目内部缓存)呢!
- 弱引用
弱引用的使用和软引用类似,关键字变成了WeakReference
WeakReference<Demo> weakReference = new WeakReference<Demo>(new Demo());
特点是不管内存是否足够,只要发生GC,就会被回收,如果想了解相关用法可看一下ThreadLocal的源码
- 虚引用
ReferenceQueue queue = new ReferenceQueue(); PhantomReference<Demo> reference = new PhantomReference<Demo>(new Demo(), queue);
当发生GC操作,GC准备回收某个对象时,如果发现该对象有虚引用,就会在回收前,把这个虚引用加入到与之关联的ReferenceQueue中,通过ReferenceQueue获取进行其他操作
无法通过虚引用来获取一个对象的真实引用(直接返回null),可见PhantomReference的get方法:public T get() { return null; }
关于操作用法可关注下NIO,使用虚引用管理堆外内存