1. 程式人生 > >android studio 分析記憶體溢位

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


monitor具體使用步驟,請參考其他同學的指導:http://blog.csdn.net/chengliang0315/article/details/53780758