【问题标题】:Do create View passing Activity as Context cause memory leak?创建 View 传递 Activity 作为 Context 会导致内存泄漏吗?
【发布时间】:2018-01-12 10:04:26
【问题描述】:
public class MainActivity extends Activity {
    private TextView textView;
    protected void onCreate(Bundle savedInstanceState) {
        textView = new TextView(this);
        textView.setText("some text");
        setContentView(textView);
    }
}

我们有两个对象:MainActivity 的一个实例和TextView 的一个实例,它们都相互引用。所以基本上它会导致内存泄漏。我说的对吗?

【问题讨论】:

  • 我说的对吗?不..
  • 你是怎么知道它导致内存泄漏的?
  • @NongthonbamTonthoi 两个对象之间有双向引用。所以 GC 不能释放他们中的任何一个。
  • 所以 GC 不能释放他们中的任何一个。 是的,它可以...... TextView 只被 Activity 引用......所以很明显如果 Activity 不再需要 GC也可以免费释放 TextView ...问题是 private TextView textView; 是否为 private static TextView textView;
  • @Selvin 你能解释一下吗?

标签: android


【解决方案1】:

这是一个与garbage collection algorithms相关的问题

你在想的是Reference counting algorithm。正如您所说,circular reference 的情况存在一些问题。因此它不再用于现代 JVM。

您应该查看其他垃圾收集算法并了解现代 JVM gc 的工作原理。

https://www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/

【讨论】:

    【解决方案2】:

    否,请参阅此 thisthis 答案

    【讨论】:

    • @Selvin 你可以通过ApplicationContext 而不是Activity
    • 不,如果你想要主题视图应用程序上下文没有这样的信息...
    • 请参考this答案。我可能错了。
    • 请阅读答案:但在 适配器构造函数的情况下,传递活动实例是完全可以的,因为适配器生命周期与活动生命周期耦合。通常它会在活动后被垃圾收集。 与视图相同的故事......以及生命不超过活动生命的任何对象
    • @Selvin 你能给我介绍一下证明你观点的文档吗?您从哪里得到这个想法“因为适配器生命周期与活动生命周期相耦合”?
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    相关资源
    最近更新 更多