ok模暗、寫一段內(nèi)存泄漏的code
private TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_analyze);
txt = (TextView) findViewById(R.id.txt);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
txt.setText("Done");
}
}, 800000L);
}
注意這個匿名的Runnable被送到了Handler中帮非,而且延遲非常的長。現(xiàn)在我們運行這個Activity,反復(fù)旋轉(zhuǎn)屏幕褪秀。
為什么會內(nèi)存泄漏、閱讀過上篇文章(Android AndroidStudio MAT LeakCanary 內(nèi)存分析之 初識內(nèi)存泄漏)的道友已經(jīng)明白了薛训。在翻轉(zhuǎn)屏幕的時候Activity 就 Destroy了媒吗、但是runnable中的TextView還持有著Activity的引用,那么導(dǎo)致Activity不能被GC乙埃、導(dǎo)致內(nèi)存泄漏
先用Memory Monitor(3.0以上為Android Profiler)
來回橫豎屏動作闸英,然后點擊GC按鈕
image.png
可以看到Activity有8個實例
image.png
點擊jump to source,就可以看到對應(yīng)的泄漏代碼了介袜。
如果想用其他工具分析Hprof甫何,那么需要先將hprof文件導(dǎo)出,然后在將其轉(zhuǎn)換為javase的hprof文件遇伞。
image.png
個人經(jīng)驗可以先用studio分析出可疑的泄漏位置沛豌,如果還不能發(fā)現(xiàn)就放到mat里進一步分析
image.png
剩下的就是根據(jù)代碼的了解程度和詳細的對比給出結(jié)論了,注意,慢工出細活加派,急不來叫确。