我正在編寫我的第一個應用程序,並試圖瞭解如何使用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
7個的實例。由於我沒有對這個應用程序做任何事情,我是否認爲這完全是因爲這些實例還沒有被GC'd?在這種情況下,我是否認爲Android在定位更改之後沒有GC,只有當它需要更多內存時才適用?
你說的沒錯,你的設備只是沒有運行GC。 DDMS有一個強制GC的按鈕,所以我建議你這樣做,並得到第三個堆轉儲:當然這些MainActivity的7個實例將減少到1. –
另外,請注意,你不能確定何時android將運行GC。即使你「強制」這個系統,系統也會有最好的時間來做這件事。 [這裏](http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html)是一個很好的創建一個危險的泄漏使用處理程序類 –
@ Plinio.Santos三分之一在通過DDMS強制執行GC之後堆轉儲,是的你是對的,MainActivity的實例減少到1.很好理解,重要的是要理解關於GC的情況,如果你有機會找到內存泄漏。 –