活动中的静态变量导致内存泄漏?

时间:2014-03-25 05:49:37

标签: java android memory memory-leaks

我没有遇到内存泄漏问题,但我需要知道内存泄漏是如何发生的。表单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如何收集参考资料?。

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

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);
    }

1 个答案:

答案 0 :(得分:3)

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

  

如果对象无法从任何活动线程或任何静态引用访问,则该对象符合垃圾收集或GC的条件,换句话说,如果对象的所有引用都为空,则可以说对象符合垃圾回收条件。

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

同时阅读本文将澄清您对GarbageCollector

的疑虑
  

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

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

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