四种类型引用"/>
强、软、弱、虚四种类型引用
1. 强引用
把一个对象赋值给一个引用变量,这个引用变量就是一个强引用,是Java
中默认的引用方式。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制给回收掉的,即使该对象以后永远都不会被用到也不会被JVM
回收掉。因此,强引用是造成Java
内存泄漏的主要原因之一。
对于一个普通的对象,如果超出对象的生命周期范围,或者显示的将相应强引用赋值为null
,一般就认为可以被当作垃圾收集了。
如:
Object object =new Object(); // 强引用
2. 软引用
使用java.lang.ref.SoftReference
类来实现。当内存空间足够,GC
就不会去回收这个对象;当内存不足,就会回收。软引用可用来实现内存敏感的高速缓存。
如:
String str=new String("abc"); // 强引用
SoftReference<String> softRef=new SoftReference<String>(str); // 软引用
比如:当浏览器应用按下返回按钮的时候,是重新从访问还是加载缓存?如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出。那么就可以设计为软引用,如果没有被回收,直接显示,否则就请求。
比如:在Android
中可以通过软引用实现图片缓存,防止内存溢出。
Android开发中, 我们通常需要用到缓存,比如加载图片。使用缓存的好处大家都知道, 比如避免重复访问网络资源、避免重复读取磁盘等, 以提升图片显示速度,这里就不再详述。加载图片使用缓存, 经常会出现OOM(out of memory, 内存不足)。为了避免OOM, 必须要在向内存中加载新资源的同时, 将旧的资源释放。
原文链接:
在Android
开发中,为了避免OOM
。在较早时候开发者通常使用软引用解决给问题,而现在,被广泛使用的方法是使用LruCache
。
- 软引用释放资源是被动的, 当内存不足时, GC会对其主动回收。
LruCache
内部通过一个LinkedHashMap
保存资源的强引用。有设置的初始化大小,如果超过, 就将排序最靠前(即最近最少使用)的资源从LinkedHashMap
中移除。其控制内存的方式是主动的。
弱引用实现缓存, 有一个必要条件就是它在系统内存不足时才会被释放,而从 Android 2.3 (API Level 9)
开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠, 即在内存充足的情况下, 它们指向的对象依然有可能被回收。如此, 软引用Map
做缓存, 缓存命中率会变低,效果就会大打折扣。
所以, 使用LruCache
成为了现在实现内存缓存的主流方式, 显然更可靠,也更值得推荐。
3. 弱引用
使用java.lang.ref.WeakReference
类来实现,它比软引用的生存周期更短。对于只有弱引用的对象来说,只要有垃圾回收,不管JVM
的内存空间够不够用,都会回收该对象占用的内存空间。
如:
WeakReference< People > reference=new WeakReference< People >(obj);
4. 虚引用
使用java.lang.ref.Phantomreference
类来实现。顾名思义,虚引用就是形同虚设。在任何时候都可能被垃圾回收器回收掉,他不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue
)联合使用。他的构造方法必须传递RefenceQueue
参数,当GC
准备回收一个对象时,发现它还有虚引用,就会在回收前,把虚引用加入到引用队列中,程序可以通过判断队列中是否加入虚引用来判断被引用的对象是否将要GC
回收,从而可以在finalize
方法中采取措施。
如:
PhantomReference< People > pr = new PhantomReference< People > (object, ReferenceQueue);
Thanks
- 【Android】软引用(SoftReference)与LruCache
- Mybatis系列6:弱引用缓存,软引用缓存和虚引用缓存
- java的四种引用,强弱软虚,用到的场景
更多推荐
强、软、弱、虚四种类型引用
发布评论