Java对象的强软弱虚四种引用的作用与回收
2016-09-15 23:21
549 查看
Java对引用的分类有 Strong reference, SoftReference, WeakReference, PhatomReference 四种。
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。
软/弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。利用这个队列可以得知被回收的软/弱引用的对象列表,从而为缓冲器清除已失效的软/弱引用。
假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软/弱引用技术来避免这个问题发生。以下就是高速缓冲器的雏形:
首先定义一个HashMap,保存软引用对象。
再来定义一个方法,保存Bitmap的软引用到HashMap。
使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。
如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。
另外可以根据对象是否经常使用来判断选择软引用还是弱引用。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。
软/弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。利用这个队列可以得知被回收的软/弱引用的对象列表,从而为缓冲器清除已失效的软/弱引用。
假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软/弱引用技术来避免这个问题发生。以下就是高速缓冲器的雏形:
首先定义一个HashMap,保存软引用对象。
private Map <String, SoftReference<Bitmap>> imageCache = new HashMap <String, SoftReference<Bitmap>> ();
再来定义一个方法,保存Bitmap的软引用到HashMap。
public class CacheBySoftRef { //首先定义一个HashMap,保存软引用对象 private Map<String,SoftReference<Bitmap>> imageCache=new HashMap<>(); /** * 再来定义一个方法,保存Bitmap的软引用到HashMap */ public void addBitmapToCache(String path){ //强引用的Bitmap对象 Bitmap bitmap= BitmapFactory.decodeFile(path); //软引用的Bitmap对象 SoftReference<Bitmap> softBitmap=new SoftReference<Bitmap>(bitmap); //添加该对象到Map中使其缓存 imageCache.put(path,softBitmap); } /** * 获取的时候,可以通过SoftReference的get()方法得到Bitmap对象 * @param path * @return */ public Bitmap getBitmapByPath(String path){ //从缓存中取软引用的Bitmap对象 SoftReference<Bitmap> softBitmap=imageCache.get(path); //判断是否存在软引用 if (softBitmap==null){ return null; } //通过软引用取出Bitmap对象,如果由于内存不足Bitmap被回收,将返回null, // 如果未被回收,则可以重复使用,提高速度 Bitmap bitmap=softBitmap.get(); return bitmap; } }
使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。
如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。
另外可以根据对象是否经常使用来判断选择软引用还是弱引用。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。
相关文章推荐
- Java四种对象引用类型:强软弱虚
- Java对象的生命周期与垃圾回收以及四种引用
- 对象引用JAVA 各种reference和垃圾回收机制
- Java四种引用类型与垃圾回收
- java四种对象引用类型区别
- 对象的引用的四种级别以及serializable作用和实现
- Java 中对象的引用的四种级别
- Java四种对象引用
- java对象的四种引用
- 我爱学Java之四种引用类型(强软弱虚)
- Java中四种引用详解(不同类型引用的JVM回收策略)
- Java 中的四种引用及垃圾回收策略
- Java中强软弱虚四种引用
- 对象的垃圾回收和四种引用
- Java四种引用:强软弱虚
- Java基础复习笔记 对象状态、引用种类、垃圾回收形式02
- 对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- 面向对象_引用类型_内存分析_垃圾回收JAVA028-033
- java的四种引用对象介绍
- 【Java讨论】引用类型赋值为null对加速垃圾回收的作用(转载)