2014-03-25 43 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?