JAVA强引用、软应用、虚引用、弱引用
java中提供了四个对象引用:强引用、软引用、弱引用、虚引用。除了强引用,其他的三种引用在java.lang.ref 中都可以找到。
1、强引用
代码实例:Object ob=new Object();
强引用有几个特性:
l 强引用可以直接访问引用对象
l 强引用在任何时候都不会被释放,虚拟机就算报OOM也不会释放对象
l 强引用可能会引起OOM
2、软引用
代码实例:
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
obj=sf.get();//get方法可以获取对象
软引用的特性:
l GC不一定会回收软引用对象,但是当内存紧张的时候会进行内存回收。
l SoftReference在手机移动开发中使用场景比较多,比如缓存图片(局限于手机内存不高)
3、弱引用
代码实例:
Object obj = new Object();
WeakReference<Object> sf = new WeakReference<Object>(obj);
obj = null;
obj=sf.get();//get方法可以获取对象
弱引用的特性
l 弱引用在系统GC时一定会回收对象。但是由于进行GC的线程优先级是非常低的,所以不一定很快能发现弱引用对象,所以弱引用还是能存在相当厂的时间。
4、虚引用
代码实例:
Object obj = new Object();
ReferenceQueue<Object> queue=new ReferenceQueue<>();
PhantomReference<Object> sf = new PhantomReference<Object>(obj,queue);
obj = null;
虚引用的特性:
l 虚引用是所有的引用最弱的,一个持有虚引用的对象跟没有引用对象几乎一样,随时可能被GC回收掉。当试图通过get方法获取强引用时候,总是失败的。并且虚引用必须使用引用队列,追踪回收过程。