vainquit 2021-02-05 15:13 采纳率: 75%
浏览 56
已采纳

Acvitiy销毁时,是否把所有引用都清除了?

首先我知道题目的答案肯定是否定的,因为假如finish()能一键清理所有引用的话,就不会有那么多memory leak之类的bug了。

我查到memory leak一般是由非静态内部类(non-static inner class)或非静态匿名类导致的,因为它们总是持有外部类的引用;如果外部类就是Activity,就会导致GC无法回收。

那问题来了,finish()既然能清除掉其他所有的引用,为什么就不能也清除掉非静态内部类持有的引用呢?

例如现在有10个View,它们本身就带有getContext()方法,说明它们都持有对其所在的Context的引用;然后这个context其实是一个Activity,里面还定义了个非静态内部类,那么这个内部类也持有该Activity的引用。那么现在执行finish(),Activity本该销毁,凭什么其他10个View的引用都清除了,就只剩下这个非静态内部类持有的引用不清除呢?

  • 写回答

2条回答 默认 最新

  • 微光长明 2021-02-05 15:30
    关注

    我的理解:finish是结束自身,但最终回收是由GC回收决定,虚拟机的回收机制是根可达计算方式,View是依附于Activity上的,可以看作Acitivity

    可回收时View已经没有其他引用到的地方了,这样View 的回收是没有阻碍的(他们都在GC回收线程工作时被回收) ,非静态内部类持有外部类引用导致外部类无法被回收从而内存泄漏,这是因为这个非静态内部类没有办法回收,如自定义的handler,它还在工作,UI线程中持有handler的引用导致Activity不能回收,导致泄漏,这个时候是需要将它设为静态类的,如果你的View是有被Gc root引用到的话,它的activity同样也没法回收,finish的源码我没有具体去看,但看过虚拟机原理,这是我大致的了解,欢迎继续沟通

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 GD32 SPI通信时我从机原样返回收到的数据怎么弄?
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?