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」,是否是很爽。