对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。
在 SoftReference 类中,有三个方法,两个构造方法和一个 get 方法(WekReference 类似)。get 方法用来获取与软引用关联的对象的引用,如果该对象被回收了,则返回null。在使用软引用和弱引用的时候,我们可以显示地通过 System.gc() 来通知 JVM 进行垃圾回收,但是要注意的是,虽然发出了通知,JVM 不一定会立刻执行,也就是说这句是无法确保此时 JVM 一定会进行垃圾回收的。
前面讲了关于软引用和弱引用相关的基础知识,那么到底如何利用它们来优化程序性能,从而避免 OOM 的问题呢?
下面举个例子,假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。
设计思路是:用一个 HashMap 来保存图片的路径 和 相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了 OOM 的问题。在 Android 开发中对于大量图片下载会经常用到。

