內存表達方式
- VSS- Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)
- RSS- Resident Set Size 實際使用物理內存(包含共享庫占用的內存)
- PSS- Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存)
- USS- Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存)
我們在Android手機的設置頁面看到的內存占用情況,就是使用了PSS標準。同時在內存優(yōu)化過程中,也經常被用作衡量指標。
PSS內存查看方式
- adb shell dumpsys meminfo
- 手寫測試程序:
- activitymanager.getRunningAppProcesses():
- memoryinfo[0].getTotalPss():
dumpsys meminfo詳述

接下來,我們對上圖中的信息做詳細說明:
-
Dalvik Heap
在app中由Dalvik申請的內存。
Pss Total包含了Zygote申請的內存(只不過Pss是按照共享數(shù)均分給每個進程)。
這里做下說明,android下所有app的進程均是fork自Zygote,從Zygote進程 fork 時,子進程完全拷貝了Zygote進程的虛擬內存空間(包括加載的so占用、resource資源占用、主動申請等內存空間等)。但當繼承自Zygote進程的內存被修改時,由于copy-on-write,會申請新的內存空間,這就會形成Private Dirty內存。當繼承自Zygote進程的內存沒被修改時,是不用分配額外的內存空間。
-
Private Dirty
它是app自己提交的內存總數(shù),包含了app自己主動申請的和修改了的繼承自Zygote的內存。
其實,Private Dirty表示了該進程私有的,不跟disk數(shù)據一致的內存段。例如堆(heap),棧(stack),bss段。注:在新平臺上,用于管理Dalvik的內存(如, just-in-time compilation (JIT) and GC bookkeeping)不再像以前一樣歸到 Dalvik Heap,而是歸類到 Dalvik Other。
Heap Size/Alloc/Free
Heap Alloc是(Dalvik、native)app申請的內存記錄,包括了Private Dirty和繼承自Zygote的(多進程共享的)內存。所以,它是比Pss Total和Private Dirty都要大的。Private clean
它包括該進程獨自使用的so和dex。Clean內存的好處是在內存緊張時,可以釋放物理內存。因為是clean的,所以不需要寫回到disk,只需要下次讀取該內存(導致缺頁錯誤)時再從disk讀入。Shared Clean
它表示多個進程共享的so和dex。關于so庫的加載,第一次是以MAP_PRIVATE參數(shù) mmap so,內存都是private clean的。如果另外一個進程mmap了同一個so,就變成shared clean了。
DDMS:MemoryMonitor
Android自帶的內存查看工具,查看的是Dalivik Heap Size/Alloc/Free。
內存優(yōu)化工具:MAT
強大的內存分析工具,MAT,分析的文件hprof文件有以下獲取方式(都需要使用hprof-conv工具轉換):
- DDMS 中dump出來
- 函數(shù):dumpHprofData()生成
使用MAT分析內存時,會遇到一些術語比較難懂的術語,這里簡單說明下:
RetainedHeap:
它表示如果一個對象被釋放掉,那會因為該對象的釋放而減少引用進而被釋放的所有的對象(包括被遞歸釋放的)所占用的heap大小。(又開始Histogram中不顯示Retained heap,需要點擊那個計算器的按鈕才會計算出來)。這里最小的粒度是類級別的。Dominator Tree:
它表示對象引用樹(原來是用圖表示對象引用關系)。-
MAT中點擊右鍵
- 在List objects中選擇with outgoing references和with incoming references。這是個真正的引用圖的概念,表示該對象的出節(jié)點(被該對象引用的對象)和入節(jié)點(引用到該對象的對象)。
- Path to GC Roots:GC roots是可能導致GC的節(jié)點。這個Path則是從這些GC root節(jié)點中的某個到當前對象的最短引用路徑。對這個如何計算不是很確定,我想應該是根據引用樹而不是dominator tree。
參考:
https://developer.android.com/studio/profile/investigate-ram.html#LogMessages
https://www.youtube.com/watch?v=ptjedOZEXPM