引用的四种分类

  • 强引用(Strong Reference):JVM宁愿抛出OOM,也不会让GC回收的对象
  • 软引用(Soft Reference) :只有内存不足时,才会被GC回收。
  • 弱引用(weak Reference):在GC时,一旦发现弱引用,立即回收
  • 虚引用(Phantom Reference):任何时候都可以被GC回收,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否存在该对象的虚引用,来了解这个对象是否将要被回收。可以用来作为GC回收Object的标志。
引用的四种分类_第1张图片
image.png

注意Android中存在的差异
但是在2.3以后版本中,系统会优先将SoftReference的对象提前回收掉, 即使内存够用,其他和Java中是一样的。所以谷歌官方建议用LruCache(least recentlly use 最少最近使用算法)。会将内存控制在一定的大小内, 超出最大值时会自动回收, 这个最大值开发者自己定。其实LruCache就是用了很多的HashMap,三百多行的代码

在开发过程中,保存对象,这时我很可以直接使用LruCache来代替,Bitmap对象:

在Android开发过程中,我们常常使用HasMap保存对象,但是为了防止内存泄漏,在保存内存占用较大、生命周期较长的对象的时候,尽量使用LruCache代替HasMap用于保存对象。

而造成不能回收的根本原因就是:堆内存中长生命周期的对象持有短生命周期对象的强/软引用,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收。

你可能感兴趣的:(引用的四种分类)