- 移動App性能評測與優化
- TMQ專項測試團隊
- 713字
- 2019-01-03 21:41:03
1.2.4 新的問題
經過上一輪的優化,在內存監視器里新版本的Heap內存表現已經比較好了,新功能只消耗了幾萬字節到幾十萬字節內存。但是要注意的是,Heap內存并不是應用的全部,我們在設置或其他管理工具里看到的應用內存大小是應用整個進程的內存使用量。也有可能出現Heap部分完全沒有增長而其他部分增長的情況。
要觀察進程的內存使用情況,就需要用到其他的觀測工具,Android里最常用于觀察進程內存的方法就是dumpsys meminfo <package name/pid>命令。
對我們的新版應用執行該命令,能夠得到以下的輸出結果:
** MEMINFO in pid 17481 [com.example] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 28 8 28 5744 3739 1117 Dalvik Heap 10112 10224 9624 14076 10386 3690 Dalvik Other 3212 3076 0 0 Stack 270 270 0 0 Ashmem 2 0 0 0 Other dev 7 0 4 0 .so mmap 1867 1330 160 0 .jar mmap 4 0 4 0 .apk mmap 2944 0 2690 0 .dex mmap 4110 64 3420 0 Other mmap 16 4 4 0 Unknown 2351 2331 0 0 TOTAL 24895 12404 6212 0
在以上輸出結果中,左邊Pss列的數據標識進程各部分對真實物理內存的消耗,左下角的TOTAL值就是我們在各種管理工具里看到的應用內存消耗。
而Android Studio等工具里顯示的內存值,在這里是Dalvik Heap Alloc部分。根據以上的數據,我們可以看到Dalvik Heap和Heap Alloc不是相等的,而且除了Dalvik Heap之外,還有其他很多部分也會消耗內存。
這時候我們再對比一下舊版,看看是否也如此:
** MEMINFO in pid 14233 [com.example] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 28 8 28 5664 3767 1040 Dalvik Heap 8026 10372 7508 11784 10113 1671 Dalvik Other 3159 3076 0 0 Stack 260 260 0 0 Ashmem 2 0 0 0 Other dev 7 0 4 0 .so mmap 1887 1344 160 0 .jar mmap 4 0 4 0 .apk mmap 2941 0 2680 0 .dex mmap 4013 64 3360 0 Other mmap 16 4 4 0 Unknown 2256 2244 0 0 TOTAL 22599 17372 13716 0
這時候就會發現問題了,Heap Alloc沒增加多少,但Dalvik Heap Pss增加了許多。而其他部分基本保持不變或有少量增長??梢妴栴}還是出現在Dalvik Heap部分,但只靠檢查分配的對象是看不出來問題的。
Java代碼的內存分配和釋放都是由虛擬機管理的,那么這個問題會是虛擬機的問題嗎?我們接下來繼續通過虛擬機部分機制來探索這些內存增長的原因。