IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android-强引用、软引用、弱引用、虚引用的区别与应用 -> 正文阅读

[移动开发]Android-强引用、软引用、弱引用、虚引用的区别与应用

1、强引用(StrongReference)

强引用就是平时最常用的定义变量的方式,即:

    //这都是我们最常定义变量的方式
    val strongReference="强引用"
    val strongReferenceList= mutableListOf<String>("强","引","用")
  • 强引用可以直接访问目标对象。
  • 强引用所指向的对象在任何时候都不会被系统回收。当内存空间不足时,Java虚拟机宁可抛出OutOfMemoryError异常,也不会通过去回收强引用所指向的对象来释放内存。
  • 强引用可能导致内存泄露。

2、软引用(SoftReference)

软引用就是在原先定义一个对象的条件下,再将这个对象装进SoftReference中,通过调用SoftReference中的get()函数,可以拿到我们装入SoftReference的对象。

    //将String对象装进软引用softReference中
    val softReference=SoftReference("软引用")
    //通过get()函数来取String对象
    softReference.get()

如果软引用指向的对象被回收了,那么get()函数将会返回null值,所以在使用时,需要判断一下获取的对象是否为null值,避免出现NullPointerException异常导致程序崩溃。
image.png

    • 如果一个对象只具有软引用,那么如果内存足够,软引用指向的对象不会被回收,调用get()函数会返回当前指向的对象;当内存不足时,则会被回收,调用get()函数则返回null值。
  • 软引用可用来实现内存敏感的高速缓存。
  • 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所指向的对象被回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列ReferenceQueue中。
引用队列(ReferenceQueue)
    //referenceQueue的类型需要和softReference的类型一致
    val referenceQueue: ReferenceQueue<String> = ReferenceQueue()
    //为SoftReference传入一个引用队列
    val softReference=SoftReference("软引用",referenceQueue)
    
  • 当软引用指向的对象被回收后,此软引用将会被传入referenceQueue引用队列中(referenceQueue引用队列中存储的都是被回收了的引用)。
  • 当我们调用引用队列的poll()方法的时候,如果这个队列中不是空队列,那么将返回队列前面的那个Reference对象;如果队列为空,那么将返回一个null值。
    引用队列的作用:用于检查引用所指向的对象是否已经被回收了。并进行一些简单操作。

3、弱引用(WeakReference)

  • 如果一个对象只具有弱引用,那么当垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不论当前内存是否足够,它都会立即把这个对象给回收掉。
  • 但是由于垃圾回收器线程优先级是很低的,因此不会立即扫描到这个只具有弱引用的对象,会有延迟。
    //创建一个弱引用对象,并指向String类型的“弱引用”
    val weakReference=WeakReference("弱引用")
    //调用get()来获取指向的String对象
    weakReference.get()

4、虚引用(PhantomReference)

  • 形同虚设,虚引用主要用来跟踪对象被垃圾回收器回收的活动。
  • 虚引用和其他引用不同的地方是:虚引用必须跟引用队列ReferenceQueue一起使用
  • 当垃圾回收器发现一个只具有虚引用的对象时,就会把这个对象回收并将其虚引用加入到引用队列中
    // 引用队列
    val phantomQueue = ReferenceQueue<String>()
    //虚引用   必须跟phantomQueue引用队列一起使用
    val phantomReference=PhantomReference("虚引用", phantomQueue)

总结

  • 优先级:强引用(不会被回收)> 软引用(内存不足时回收) > 弱引用(随时回收) > 虚引用(随时回收,基本不使用)
  • 当程序出现内存泄漏或内存溢出时,则可以考虑使用软引用或虚引用。
  • 虚引用只是为了排查对象被回收的活动。可以理解为debug?
  • 当一个对象既有强引用,又有其他引用时,则以优先级最高的强引用为准,不会被回收。其他情况也以此类推。

在安卓中,Activity A给另一个组件B传入当前Activity A的Context,那么组件B则得到了Activity A的引用;当Activity A被销毁、且组件B不需要被销毁时,由于组件B对Activity A的context存在强引用,那么这个Activity A将得不到及时的销毁,这样就造成了内存泄漏。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 13:14:01  更:2022-02-16 13:14:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:57:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码