使用 Eclipse Memory Analyzer 進行簡單內存泄漏分析

Java 內存泄露的根本緣由: 保存了不可能再被訪問的變量類型的引用。所以咱們的目的就是要找出這樣的引用。app

1.測試代碼:ide

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的進程,而後點擊spa

4.選擇Finish線程

5.在「Leak Suspects」窗口中能夠看到餅圖code

顏色越深,代表佔用內存越大。而後咱們看到「Problem Suspect 1」中有個details,對象

6.點開details,獲得:blog

 

 

 能夠看到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」,是否是很爽。

相關文章
相關標籤/搜索