android studio 分析記憶體溢位
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】分析記憶體物件(記憶體大小、佔比、引用等),定位記憶體洩露的位置