查看內存方法:
使用dumpsys meminfo方法查看
在adb shell條件下面使用如下指令查看內存使用情況
dumpsys meminfo com.incall.autofly.launcher
將會得到如下顯示列表
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 49834 49760 0 0 67584 57128 10455
Dalvik Heap 2617 2560 0 0 6605 3303 3302
Dalvik Other 1308 1308 0 0
Stack 88 88 0 0
Ashmem 2 0 0 0
Other dev 56 0 56 0
.so mmap 8045 396 1320 0
.apk mmap 531 0 40 0
.ttf mmap 159 0 96 0
.dex mmap 8756 4 7552 0
.oat mmap 1856 0 0 0
.art mmap 1737 1192 4 0
Other mmap 2215 4 944 0
EGL mtrack 6774 6774 0 0
GL mtrack 35304 35304 0 0
Unknown 8541 8520 0 0
TOTAL 127823 105910 10012 0 74189 60431 13757
我們這裏做內存優化,主要關注Native Heap Dalvik Heap .so mmap
- Native/Dalvik 的 Heap 信息 分別給出的是JNI層和Java層的內存分配情況,如果發現這個值一直增長,則代表程序可能出現了內存泄漏
- so mmap 這裏是應用的so文件佔用的內存
在做內存優化時候,我們主要關注的是整個apk佔用的內存大小,可以使用如下方法過濾
dumpsys meminfo com.incall.autofly.launcher | grep TOTAL:
這個值就是你的應用真正佔據的內存大小,獲得的佔用內存大小如下:
TOTAL: 127823
使用adb shell procrank
PID Vss Rss Pss Uss cmdline
797 4786328K 269524K 113355K 96140K system_server
3735 5307036K 215232K 88778K 77920K com.incall.autofly.launcher
- VSS- Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
- RSS- Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
- PSS- Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
- USS- Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)
- VSS : Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存),即單個進程全部可訪問的地址空間,這個大小包括了進程已經申請但尚未使用的內存空間。對於確定單個進程實際內存使用大小,VSS用處不大
- RSS : Resident Set Size 實際使用物理內存(包含共享庫佔用的內存),即單個進程實際佔用的內存大小,RSS不太準確的地方在於它包括該進程所使用共享庫全部內存大小。對於一個共享庫,可能被多個進程使用,實際該共享庫只會被裝入內存一次。
- PSS : Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)PSS相對於RSS計算共享庫內存大小是按比例的。N個進程共享,該庫對PSS大小的貢獻只有1/N。
- USS : Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)即單個進程私有的內存大小,即該進程獨佔的內存部分。USS揭示了運行一個特定進程在的真實內存增量大小。如果進程終止,USS就是實際被返還給系統的內存大小
所以,一般情況下有:VSS >= RSS >= PSS >= USS。
參考:https://blog.csdn.net/qq_31588719/article/details/89476050