在開發Android App的過程中,經常會遇到內存方面的壓力,比如OOM,或者頻繁GC。
本文不打算涵蓋內存優化的所有方面,只是介紹一下我自己遇到的問題和解決方法。
1.確定頻繁分配內存的代碼路徑。
一般來說,頻繁分配內存的路徑可能會是繪制(draw)相關的方法,排版(layout)相關的方法,某些回調方法(特別是傳感器回調方法)。
你可能會檢查這部分代碼,然后優化它。但是,內存分配可能發生在調用鏈的更下面,檢查代碼非常困難。
這里推薦一個工具,DDMS下的Allocation Tracker。它可以顯示出程序運行中頻繁分配內存的部分,並准確定位到對應的代碼。
2.減少頻繁的內存分配。
雖然Java是自動回收內存的,但是頻繁的內存分配肯定會增加GC方面的壓力,導致程序運行不流暢。
減少頻繁地創建對象或者不在這些地方創建對象是一個顯而易見的方法。
但是,也有一些比較隱秘的內存消耗點,下面就介紹一下for循環的內存消耗。
我們知道,在Java中,for循環有兩種寫法:
List<String> list = new ArrayList<String>(); // 寫法一 for(int i = 0; i < list.size(); i++) { String s = list.get(i); ...... } // 寫法二 for(String s : list) { ...... }
寫法二是Java推薦的方法,但是它卻需要分配一個迭代器對象。如果是放在onDraw這樣的方法中,那么每次調用就需要分配一小塊內存。
所以,我推薦在onDraw這樣的方法中,使用方法一。