1. 手機為APP配置設定記憶體分析
系統會給每個APP配置設定固定的記憶體空間,不同手機廠商會根據手機的配置情況來對其進行調整。
記憶體大小包括3個屬性:
dalvik.vm.heapstartsize 設定堆記憶體的初始大小
dalvik.vm.heapgrowthlimit 設定一個标準的應用的最大堆記憶體大小
dalvik.vm.heapsize 設定了使用android:largeHeap的應用的最大堆記憶體大小
如何檢視:
1) 使用代碼檢視:
ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
int heapgrowthlimit = am.getMemoryClass();
int heapsize = am.getLargeMemoryClass();
2) 手機root,檢視/system/ build.prop檔案
3) 使用adb擷取
adb shell getprop dalvik.vm.heapstartsize 應用啟動後配置設定的初始記憶體
adb shell getprop dalvik.vm.heapgrowthlimit單個标準應用程式最大記憶體限制
adb shell getprop dalvik.vm.heapsize 單個dalvik虛拟機最大的記憶體限制
2. 設定android:largeHeap = true (治标不治本)
使用android:largeHeap="true"不需要特殊的權限,我們好像不用就白不用。多一點記憶體,就少了一點OutOfMemoryError的風險。這樣隻是治标不治本,也隻是延遲了一下OOM的出現而已,我們應該從代碼本身去查找,從根本上解決問題。
是以在開發的時候,建議先不要使用android:largeHeap="true",如果是占用記憶體較大的應用,比如我們在機頂盒上開發的視訊播放器應用,顯示的圖檔都較大,而且播放視訊本身也比較消耗記憶體,是以在應用開發完成,測試通過釋出時再加上android:largeHeap="true"。
3. 截止今日,RAM最大是多少?
目前手機最新記憶體發展到8G但是市面沒有普及,現在普及最多的是6G記憶體和4G記憶體。
4. ROM 、RAM、 運作時記憶體差別
ROM通常指固态的存儲器
RAM類似于記憶體條
運作時記憶體是指作業系統會将程式運作中申請的記憶體(虛拟記憶體)映射到RAM,讓程序能夠使用實體記憶體
5. Shallow Size、RetainedSize、Heap Size和Allocated Size
Shallow Size: 對象本身占用的記憶體空間,不包含其引用的對象
Retained Size: 對象本身的Shallow Size + 對象能直接或間接通路到的對象的Shallow Size,也就是說Retained Size就是該對象被gc之後所能回收記憶體的總和。
Heap Size: 堆的大小(記憶體溢出限值)
Allocated Size:堆中已配置設定的大小,即App應用實際占用的記憶體大小。
6. 記憶體分析工具
Android Monitor
1. 操作APP + GC + 圖表判斷 + DUMP JAVA HEAP(适用于一般的記憶體洩露檢測,效率高)
1) 啟動APP 觀察記憶體變化
2) 操作不同的功能 +
3) 點選GC 觀察記憶體變化
4) 如果GC後記憶體無法被釋放(現象:記憶體仍然遞增),則該功能存在記憶體洩露
5) 點選【DUMP JAVA HEAP】分析記憶體對象(記憶體大小、占比、引用等),定位記憶體洩露的位置
monitor具體使用步驟,請參考其他同學的指導:http://blog.csdn.net/chengliang0315/article/details/53780758