四大引用
- 强引用(Strong Reference)
- 软引用(Soft Reference)
- 弱引用(Weak Reference)
- 虚引用(Phantom Reference)
- 四种引用类型。这四种引用类型的引用强度依次逐渐递减。
强引用:
- 强引用在代码中普遍的存在,类似于“Object obj = new Object()”,只要某个对象有强引用与之关联,JVM则无法回收该对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误,也不会回收这种对象。
软引用:
- 软引用常常用来描述一些有用但是非必需的对象。对于软引用关联的对象,会在JVM内存不足时既OutOfMemory之前将这些对象列入回收范围,进行二次回收。如果这时回收还是没有足够的内存才会造成内存溢出异常。在JDK1.2之后,提供了SoftReference类来实现软引用。软引用一般用于网页的缓存图片的缓存等等比较耗时的操作,但是这些操作目前一般使用LruChche来实现,因此目前代码中很少见到SoftReference。
弱引用:
-
弱引用也是用来描述非必要对象的,但是它的轻度比软引用要弱一些,被弱引用关联的对象只能生存到下一次垃圾收集器回收之前,当JVM进行gc操作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK1.2以后,提供了WeakReference类来实现弱引用。弱引用的使用范围也很小,Android 中最常见的是WeakHandler
-
如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
-
优化Handler时,为何选择弱引用而不选择软引用?
handler产生内存泄露原因:静态内部类持有外部类的匿名使用,导致在用户退出当前Activity时,handler内部的一些耗时操作还在运行,从而导致activity还被handler做引用,最终导致activity还存留在堆栈中,没有被回收,导致内存泄露。
当用户退出activity时就只剩下handler还存在activity的引用了,这时候碰到GC时需要将handler中的引用回收,只有弱引用达到要求,软引用可能需要等待到内存不足时才能回收。
虚引用:
- 虚引用也称之为幽灵引用,或者幻影引用,它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响。也无法通过虚引用来取得一个对象的实例,为一个对象设置为虚引用的唯一目的是希望这个对象被回收器回收时能收到一个系统通知,在JDK1.2之后,提供了PhantomReference类来实现虚引用。