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