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的进程,然后点击
4.选择Finish
5.在“Leak Suspects”窗口中可以看到饼图
颜色越深,表明占用内存越大。然后我们看到“Problem Suspect 1”中有个details,
6.点开details,得到:
可以看到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,得到如下页面:
可以看到,对象mList内存占用大,而且也给出了它所在的类“com.example.zhbjn.MainActivity”,是不是很爽。