使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

时间:2023-03-09 21:41:10
使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

Java 内存泄露的根本原因: 保存了不可能再被访问的变量类型的引用。因此我们的目的就是要找出这样的引用。

1.测试代码:

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Vector v = new Vector();
for (int i = 1; i < 1000000; i++) {
String str = new String("测试数据"+i);
v.add(str);
// o = null;
}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。
}
}

2.转到DDMS模式

3.在Devices列表中选中测试app的进程,然后点击

使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

4.选择Finish

使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

5.在“Leak Suspects”窗口中可以看到饼图

使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

颜色越深,表明占用内存越大。然后我们看到“Problem Suspect 1”中有个details,使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

6.点开details,得到:

使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

可以看到vector占用了大量内存,而其存在于main thread中。这个例子中没有指出这个对象具体在哪个类中,只说了它在UI线程中,还要我们自己去找它是在主线程中哪个位置。

PS:下面的例子可以找到内存泄漏的对象是在哪个类中。

将上面第1步的测试代码换成如下的代码:

public class MainActivity extends Activity {
private ArrayList<String> mList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 10000000; i++) {
String str= new String("测试字符串"+i);
mList.add(str);
}
}
}

重复以上步骤2~5,第6步如下:

6.点开details,得到如下页面:

使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

可以看到,对象mList内存占用大,而且也给出了它所在的类“com.example.zhbjn.MainActivity”,是不是很爽。