使用 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”,是不是很爽。

原文地址:https://www.cnblogs.com/johnsonwei/p/5859749.html