使用 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的进程,然后点击
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”,是不是很爽。