前篇文章是转载网上的内存分析工具mat的使用,这篇是实战,有些细节不一样
代码准备
- 主要的android代码入口MainActivity ,跳转到sencond
package com.example.com.oom;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(newOnClickListener);
}
private OnClickListener newOnClickListener = new OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, sencond.class);
MainActivity.this.startActivity(intent);
}
};
- sencond.class
package com.example.com.oom;
import android.app.Activity;
import android.os.Bundle;
public class sencond extends Activity {
private static deak mLeak;
private static teak tLeak;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mLeak = new deak();
tLeak = new teak();
}
class deak {
}
class teak {
}
}
- 注意 要到manifest.xml中的application目录下加入
<activity android:name="sencond"></activity>
执行操作
手动多次点击首页的跳转(切换到了sencond),然后按返回键
- 点击ddms,点击dump hpero file--默认选项点击完成
- 点击histogram
- 搜索包名
- 后面的$deak,teak就是内存泄露的类,意思就是在activicity下的sencond中的deak,teak有内存泄露
注意
快速找出某个实例没被释放的原因,可以右健 Path to GC Roots-->exclue all phantom/weak/soft etc. reference
这个我试过了,并没有数据