Java 软引用和弱引用
软引用(SoftReference)
软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。
弱引用(WeakReference)
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示
虚引用(PhantomReference)
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
如何利用软引用和弱引用解决OOM问题
下面举个例子,假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。
设计思路是:用一个HashMap来保存图片的路径 和 相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。在Android开发中对于大量图片下载会经常用到。
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
public void addBitmapToCache(String path) {
// 强引用的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeFile(path);
// 软引用的Bitmap对象
SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);
// 添加该对象到Map中使其缓存
imageCache.put(path, softBitmap);
}
public Bitmap getBitmapByPath(String path) {
// 从缓存中取软引用的Bitmap对象
SoftReference<Bitmap> softBitmap = imageCache.get(path);
// 判断是否存在软引用
if (softBitmap == null) {
return null;
}
// 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空
Bitmap bitmap = softBitmap.get();
return bitmap;
}
- Java 强引用、软引用、弱引用、虚引用
- java是值传递还是引用传递
- Java垃圾回收机制与引用类型
- Java之基本类型和引用类型、引用传递和值传递、“==”和equals()
- Java 强引用、弱引用、软引用、虚引用
- 读thinking in java的收获(一)——java中的引用,c++引用与c指针的区别与联系以及java的数据类型
- java的传值与传引用
- Java知识(多态和引用类型转换)
- java中的赋值,引用
- 浅谈一下JAVA对象,对象引用以及对象赋值
- Java父类对象引用指向子类对象
- Java:按值传递还是按引用传递详细解说
- JAVA学习笔记3--类,对象,变量,方法,构造方法,this,引用类型
- Java中四种引用类型详细介绍
- JNI学习笔记5——本地方法处理java数组/引用问题/缓存jfieldID/jmethodID
- Java篇 - 四种引用(Reference)实战
- Java对对象的引用(强,软,弱,虚)
- Java中的值传递与引用传递
- 我终于忍不住喷一下某些书了,关于Java传引用的XX言论
- gisserver for javaADF:引用的对象 "#{}" 的范围比引用对象小