2014-03-25 46 views
1

我正在編寫我的第一個應用程序,並試圖瞭解如何使用MAT來查找潛在的內存泄漏。爲了簡單起見,我編的默認開始在Android Studio中一個新的項目時所提供的Hello World應用,即使用MAT瞭解Android內存泄漏

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

} 

尼斯和簡單。現在,在我的平板電腦上啓動此應用程序後立即使用DDMS和hprof-conv轉換工具進行堆轉儲(heap-conv-1.hprof)。然後,我將該平板電腦旋轉20次,以使活動經歷多個生命週期,然後我再次進行堆轉儲(heap-conv-2.hprof)。

我將兩個堆轉儲文件加載到MAT中,比較它們併爲.*MainActivity.*執行正則表達式。其結果是:

MainActivity objects shown in MAT

現在還有的旋轉後MainActivity 7個的實例。由於我沒有對這個應用程序做任何事情,我是否認爲這完全是因爲這些實例還沒有被GC'd?在這種情況下,我是否認爲Android在定位更改之後沒有GC,只有當它需要更多內存時才適用?

+1

你說的沒錯,你的設備只是沒有運行GC。 DDMS有一個強制GC的按鈕,所以我建議你這樣做,並得到第三個堆轉儲:當然這些MainActivity的7個實例將減少到1. –

+0

另外,請注意,你不能確定何時android將運行GC。即使你「強制」這個系統,系統也會有最好的時間來做這件事。 [這裏](http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html)是一個很好的創建一個危險的泄漏使用處理程序類 –

+0

@ Plinio.Santos三分之一在通過DDMS強制執行GC之後堆轉儲,是的你是對的,MainActivity的實例減少到1.很好理解,重要的是要理解關於GC的情況,如果你有機會找到內存泄漏。 –

回答

1

對於您的代碼,它不會佔用太多的內存並且不會導致泄漏。Application當您將大量的bitmaps加載到內存或保存大量對象時會佔用大量內存。使用Activity上下文將long生活的對象..

這是關於谷歌開發人員內存泄漏的優秀視頻。 Memory leaks

你會了解所有的事情看着這以後。

+0

優秀的視頻。讓我更好地理解了內存泄漏和使用的工具。然而,它並沒有真正解決我的問題,即GC在方向改變後是否發生。事實上,這個視頻暗示GC在確實發生變化後確實會發生,但正如我一直在觀察的那樣,以及上面評論的@ Plinio.Santos,情況並非如此。 +1雖然爲優秀的鏈接。 –

+0

@JamesB當方向改變時,GC不保證GC.Android系統檢測到需要內存時,它會GC對象。它不會保證什麼時候運行.. –