2014-03-25 42 views
0

我不面临内存泄漏问题,但我需要知道内存泄漏是如何发生的。形式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

我觉得代码是从这个博客[避免在Android上的内存泄漏(http://www.curious-creature.org/2008/12/18/avoid-memory-画泄漏-上的Android /)。这个博客也解释了内存泄漏的发生。 – 2014-03-25 05:55:55

+0

我已经阅读过它,但我需要知道垃圾收集器如何无法收集对象,当Drawable附加到视图时,视图被设置为drawable上的回调。在上面的代码片断中,这意味着drawable对TextView有一个引用,它本身对活动有引用,所以当gc试图收集这些对象时,确切的问题是什么? – sky

回答

2

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

一个物体变得符合垃圾收集或GC如果它不是来自任何活动线程或者换句话说,任何静态引用来到达你可以说,如果所有的引用都是空的对象符合垃圾收集。

请在这里阅读更多How Garbage Collection works in Java

而且读这将澄清有关GarbageCollector

自动垃圾收集你的疑虑是看着堆内存,识别过程,对象是在使用中和不是,并删除未使用的对象。一个正在使用的对象或一个被引用的对象,意味着你的程序的某个部分仍然保持着一个指向该对象的指针。未使用的对象或未引用的对象不再被程序的任何部分引用。所以未被引用的对象所使用的内存可以被回收。

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

在这里阅读更多What is Automatic Garbage Collection?