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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM