【问题标题】:static variable in activity leads to memory leak?活动中的静态变量导致内存泄漏?
【发布时间】:2014-03-25 05:49:36
【问题描述】:

我没有遇到内存泄漏问题,但我需要知道内存泄漏是如何发生的。形成here 下面的代码会导致内存泄漏。

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

  setContentView(label);
}

谁能给我一个完整的解释内存泄漏是如何发生的?以及 gc 如何无法收集参考资料?。

还请解释一下下面的代码是否泄漏内存? ,如果它是如何发生的?

private static Context context;

    @Override
    protected void onCreate(Bundle state) {
      super.onCreate(state);

      TextView label = new TextView(context);
      label.setText("Leaks are bad");

      setContentView(label);
    }

【问题讨论】:

  • 我认为代码来自这个博客Avoid memory leaks on Android。该博客还解释了内存泄漏是如何发生的。
  • 我已经读过了,但我需要知道垃圾收集器如何无法收集对象,当 Drawable 附加到视图时,视图被设置为 drawable 上的回调。在上面的代码 sn-p 中,这意味着 drawable 引用了 TextView,而 TextView 本身也引用了 Activity,那么当 gc 试图收集这些对象时,具体的问题是什么?

标签: java android memory memory-leaks


【解决方案1】:

如果您拥有对象的referenceGC 将如何运行。你必须先释放对象。

如果一个对象无法从任何活动线程或任何静态引用中访问,则它有资格进行垃圾收集或 GC

请在此处阅读更多内容How Garbage Collection works in Java

同时阅读这篇文章,它会澄清你对GarbageCollector的疑虑

自动垃圾回收是查看堆内存,识别哪些对象正在使用,哪些没有,并删除未使用的对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。所以可以回收未引用对象使用的内存。

但在static reference 的情况下,您仍然拥有该对象的引用,因此GC 不会在该对象上运行。

在此处阅读更多信息What is Automatic Garbage Collection?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2013-11-06
    • 2010-10-13
    • 1970-01-01
    • 2013-07-26
    • 2021-05-14
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多