四种:Strong reference,SoftReference, WeakReference, PhatomReference
级别 | 回收时机 | 用途 | 生存时间 |
---|---|---|---|
强 | 从来不会 | 对象的一般状态 | JVM停止运行时终止 |
软 | 在内存不足时 | 联合ReferenceQueuee(引用队列)构造有效期短、占内存大、生命周期长的对象的二级高速缓冲器(内存不足才清空) | 内存不足时终止 |
弱 | 在垃圾回收时 | 联合ReferenceQueuee构造有效期短、占内存大、生命周期长的对象的一级高速缓冲器(系统发生GC则清空) | gc运行后终止 |
虚 | 在垃圾回收时 | 联合ReferenceQueuee来跟踪对象被垃圾回收器回收的活动 | gc运行后终止 |
下面通过实例介绍引用给我们带来的好处
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。
软/弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。利用这个队列可以得知被回收的软/弱引用的对象列表,从而为缓冲器清除已失效的软/弱引用。
在Android开发中,假设我们的应用会用到大量的默认图片(默认头像),这些图片很多地方用到,若每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。怎么改善呢
可以考虑使用软/弱引用技术来避免这个问题发生。以下就是高速缓冲器的雏形:
- 首先定义一个HashMap,保存软引用对象。
private Map <String, SoftReference<Bitmap>> imageCache = new HashMap <String, SoftReference<Bitmap>> ();
- 再来定义一个方法,保存Bitmap的软引用到HashMap。
使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。
如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。
另外可以根据对象是否经常使用来判断选择软引用还是弱引用。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。