Android强、软、弱、虚引用

相对于C/C++,Java不需要程序员自己管理内存的分配和回收,这些相关的内存操作都交给了GC(Gabage Collection)进行管理。按我们今天的理解来说,GC就像一个AI机器人,它会不定时的扫描当前内存,并且释放掉不必要的,那它是如何判断出哪些需要回收的呢。这里就引入了Java引用机制,根据引用强弱不同分为了强、软、弱、虚四个引用等级。GC会参照这个等级进行内存的回收和清理。

强引用

  • 强引用是最常见的一种,例如:

    String str = new String("");
  • 一般当一个对象可以被任何一个强引用引用到的话,那么它就不会被GC回收。

  • 因为GC会判断具有强引用的对象是你正在使用的。

  • 通常我们常见的内存泄漏就是由于过度使用强引用导致的。

软引用(SoftReference)

  • 软引用就像一个可有可无的存在,它存在你就用,它如果不存在对你的主要生活也不会有太大的影响。

  • 当一个对象被软引用时,只要内存充足GC是不会回收它的,反之如果内存不足GC就会将其回收清理。

  • 开发中我们可以将那些 存在会有益但是不存在也不会影响正常使用 的对象做成软引用。例如各种缓存对象,当内存充足时使用缓存会提高用户体验,当内存不足释放掉缓存也不会使程序崩溃。

弱引用(WeakReference)

  • 弱引用相对于软引用具有更短暂的生命周期,当GC扫描到一个仅仅被弱引用的对象,不论内存是否充足,都会将其回收。

  • 弱引用可以和一个引用队列(ReferenceQueue)联合使用,当弱引用被回收之后,虚拟机就会将这个弱引用加入到与之关联的队列中。

虚引用(PhantomReference)

  • 顾名思义,形同虚设,使用虚引用的对象和没有引用的对象一样,在任何时候都会被回收。

  • 这样的话为什么还会存在虚引用呢,因为虚引用必须和引用队列联合使用,我们可以通过判断引用队列中是否存在该对象来确定当前的状态。

  • 当GC扫描到虚引用对象后会先将其加入到引用队列中,而这时对象是还没有被回收的,这样我们就能知道对象在什么时候会被回收,并且加以操作。

应用

  • 强引用自不必多说,对象只要存在被强引用的情况就不会被GC回收,因此为了避免内存泄漏我们需要及时在长生命周期的操作中去掉对象的强引用。
  • 软引用介于其特性,内存充足时保留,内存不足时回收。十分适合用于缓存一类的对象进行存储。
  • 弱引用在Android中使用比较常见,我们经常会碰到需要使用Context及其子类如Application、Activity等组件类的时候,这时候如果使用强引用很容易出现内存泄漏的情况,而使用软引用又会造成不必要的资源浪费,因此此时使用弱引用是最好的解决方案,因为像Activity这类自带生命周期的组件都是被更底层的对象持有着强引用的,如AM(ActivityManager),因此当这类对象还处在自己的生命周期之中时是不会被轻易回收的,只有在生命周期结束之后才会被GC判定为只存在弱引用而最终被回收掉。
  • 虚引用真的是形同虚设,在如今越加不关心内存分配的今天,能用到的地方真的很少,而且其和弱引用的性质就我理解的相差无几,因此这里不做介绍。

更多相关文章

  1. Android的轻量级数据库sqlite、以及文件存取byte数组
  2. Android(安卓)UI学习 - FrameLayou和布局优化
  3. android binder机制之——(我是binder实例)
  4. 小论设计模式及在Android中的应用
  5. [Android进阶]Java、Android(安卓)内存泄漏总结
  6. android调用摄像头拍照,从相册中选择照片并裁剪
  7. Android(安卓)基于第三方登录(使用Bmob后端云存储数据)实现记忆用
  8. Android音频开发(7):使用 OpenSL ES API(下)
  9. android 学习七 一些xml layout组件的说明(自己总结不断更新)

随机推荐

  1. Android(安卓)银行卡扫描识别获取卡号
  2. Android(安卓)两个Activity之间信息的交
  3. android核心基础(8)_DDMS简介
  4. Android之DIalog的控制详解
  5. Android(安卓)AM命令及使用
  6. android ndk 入门之打印log信息
  7. Android(安卓)Studio故障处理之ADB not r
  8. Android(安卓)UI ActionBar功能-Action B
  9. 文章推荐:Android(安卓)BroadcastReceiver
  10. 利用ffmpeg和SDL实现一个跨android版本的