为啥静态内部类可以减轻内存泄漏?

Posted

技术标签:

【中文标题】为啥静态内部类可以减轻内存泄漏?【英文标题】:Why does static inner class mitigate memory leak?为什么静态内部类可以减轻内存泄漏? 【发布时间】:2018-03-07 14:45:10 【问题描述】:

我正在阅读 Efficient android Threading,上面写着

与其使用带有外部类引用的嵌套类,不如使用静态内部类,因为它们只引用全局类对象而不是实例对象。这只是缓解了泄漏,因为在线程执行时,静态内部类对其他实例对象的所有显式引用仍然有效。

但我不清楚为什么它会减轻泄漏。如果静态内部类中对其他实例对象的所有显式引用都是活动的,这不是与上述解释相反的内存泄漏原因吗?

【问题讨论】:

【参考方案1】:

非静态内部类会泄漏内存,因为它有对其外部类的隐式引用。假设您有一个实例持有对内部类对象的引用,这意味着它是活动的,而这个内部类对象持有对其外部类对象的隐式引用,这也意味着外部类对象是活动的,但它可能不会用于事实。所以对于外部类对象,由于来自内部类的引用,不会被垃圾回收器清除掉,导致内存泄漏。

您可以从这个答案中找到更多详细信息:When exactly is it leak safe to use (anonymous) inner classes?

【讨论】:

我已经明白你在说什么了。不清楚的部分是句子“因为在线程执行时,静态内部类对其他实例对象的所有显式引用仍然有效。”这句话是什么意思?

以上是关于为啥静态内部类可以减轻内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

静态内部类解决内存泄漏

此Loader类应该是静态的,否则可能会发生泄漏内部类内存泄漏| AsyncTaskLoader内存泄漏 -

android 内存泄漏出现的情况

Android内存泄漏的场景

线程造成的内存泄漏

事件侦听器中的内存泄漏