Java 为什么在GC中,来自视图的引用被清除,而来自嵌套内部类的引用在包含活动被销毁时仍然保留?

Java 为什么在GC中,来自视图的引用被清除,而来自嵌套内部类的引用在包含活动被销毁时仍然保留?,java,android,android-activity,memory-leaks,garbage-collection,Java,Android,Android Activity,Memory Leaks,Garbage Collection,我读过很多关于内存泄漏的文章。所有这些都告诉我,如果某个活动包含(非静态)嵌套内部类或(非静态)匿名内部类,那么在销毁该活动时,该活动可能不会被垃圾收集清除,因为(非静态)嵌套内部类包含对其外部类(即活动)的引用。他们还建议我尽可能使用静态内部类(因此我必须将所有嵌套的内部类更改为静态类,这是非常糟糕的做法) 但我不明白,为什么视图对象的引用不会阻止清理它们的包含活动?在我看来,在同一个活动中,来自视图的引用和来自嵌套内部类的引用没有太大区别。问题不在于有一个非静态的内部类或匿名类。这不是问题。

我读过很多关于内存泄漏的文章。所有这些都告诉我,如果某个活动包含(非静态)嵌套内部类或(非静态)匿名内部类,那么在销毁该活动时,该活动可能不会被垃圾收集清除,因为(非静态)嵌套内部类包含对其外部类(即活动)的引用。他们还建议我尽可能使用静态内部类(因此我必须将所有嵌套的内部类更改为静态类,这是非常糟糕的做法)


但我不明白,为什么视图对象的引用不会阻止清理它们的包含活动?在我看来,在同一个活动中,来自视图的引用和来自嵌套内部类的引用没有太大区别。

问题不在于有一个非静态的内部类或匿名类。这不是问题。GC可以很好地处理循环引用,它将检测到内部/匿名类引用了
活动
,并将清理所有内容。没问题

当您将对非静态内部/匿名类的引用存储在静态变量中,或者将引用传递给保存该引用的另一个组件时,会出现问题。在这些情况下,
活动
不能被垃圾收集,因为仍然有一个活动对象或静态变量包含对内部/匿名类的引用

不幸的是,许多警告内存泄漏的文章都是不正确、不完整的,或者不够详细,无法准确描述问题