ok、写一段内存泄漏的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中,而且延迟非常的长。现在我们运行这个Activity,反复旋转屏幕。
为什么会内存泄漏、阅读过上篇文章(Android AndroidStudio MAT LeakCanary 内存分析之 初识内存泄漏)的道友已经明白了。在翻转屏幕的时候Activity 就 Destroy了、但是runnable中的TextView还持有着Activity的引用,那么导致Activity不能被GC、导致内存泄漏
先用Memory Monitor(3.0以上为Android Profiler)
来回横竖屏动作,然后点击GC按钮
可以看到Activity有8个实例
点击jump to source,就可以看到对应的泄漏代码了。
如果想用其他工具分析Hprof,那么需要先将hprof文件导出,然后在将其转换为javase的hprof文件。
个人经验可以先用studio分析出可疑的泄漏位置,如果还不能发现就放到mat里进一步分析
剩下的就是根据代码的了解程度和详细的对比给出结论了,注意,慢工出细活,急不来。