天天看點

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

android studio 分析記憶體溢出

1.      操作APP + GC + 圖表判斷 + DUMP JAVA HEAP(适用于一般的記憶體洩露檢測,效率高)

1)  啟動APP 觀察記憶體變化

2)  操作不同的功能 +

3)  點選GC 觀察記憶體變化

4)  如果GC後記憶體無法被釋放(現象:記憶體仍然遞增),則該功能存在記憶體洩露

5)  點選【DUMP JAVA HEAP】分析記憶體對象(記憶體大小、占比、引用等),定位記憶體洩露的位置

android studio 分析記憶體溢出

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