標籤:android java 使用 art io for
Android記憶體限制
java虛擬機器有記憶體使用量上限的限制
adb shell進入手機,這此參數被紀錄在/system/build.prop中,如果想直接查看可以使用adb shell getprop
單個應用程式最大記憶體限制,超過這個值會產生OOM
dalvik.vm.heapgrowthlimit
應用啟動後分配的初始記憶體
dalvik.vm.heapstartsize
單個java虛擬機器最大的記憶體限制,超過這個值會產生OOM
dalvik.vm.heapsize
小米2S的一些記憶體限制
#查看單個應用程式最大記憶體限制
adb shell getprop|grep heapgrowthlimit
|[dalvik.vm.heapgrowthlimit]: [96m]
#應用啟動後分配的初始記憶體
adb shell getprop|grep dalvik.vm.heapstartsize
|[dalvik.vm.heapstartsize]: [8m]
#單個java虛擬機器最大的記憶體限制
adb shell getprop|grep dalvik.vm.heapsize
|[dalvik.vm.heapsize]: [384m]
Android記憶體使用量
android程式記憶體一般限制在16M,當然也有24M的,而android程式記憶體被分為2部分:
native和dalvik,dalvik就是我們平常說的java堆,我們建立的對象是在這裡面分配的,而bitmap是直接在native上分配的,對於記憶體的限制是 native+dalvik 不能超過最大限制。
用以下命令可以查看程式的記憶體使用量情況:
adb shell dumpsys meminfo $package_name or $pid //使用程式的包名或者進程id
查看蝦米音樂app的記憶體佔用情況
adb shell dumpsys meminfo fm.xiami.main
Applications Memory Usage (kB):
Uptime: 71696500 Realtime: 98283758
** MEMINFO in pid 17340 [fm.xiami.main] **
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 0 0 0 1976 1577 226
Dalvik 2973 13956 2712 18691 10825 7866
Cursor 0 0 0
Ashmem 0 0 0
Other dev 4 44 0
.so mmap 894 2320 604
.jar mmap 0 0 0
.apk mmap 123 0 0
.ttf mmap 0 0 0
.dex mmap 2716 0 16
Other mmap 204 120 96
Unknown 808 540 804
TOTAL 7722 16980 4232 20667 12402 8092
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 5 Activities: 0
Assets: 3 AssetManagers: 3
Local Binders: 5 Proxy Binders: 13
Death Recipients: 0
OpenSSL Sockets: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
其中size是需要的記憶體,而allocated是分配了的記憶體,對應的2列分別是native和dalvik,當總數也就是total這一列超過單個程式記憶體的最大限制時,OOM就很有可能會出現了。
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 0 0 0 1976 1577 226
Dalvik 2973 13956 2712 18691 10825 7866
TOTAL 7722 16980 4232 20667 12402 8092
Cpu使用方式
top命令如下:
adb shell
$ top -h
top -h
Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
-m num Maximum number of processes to display. // 最多顯示多少個進程
-n num Updates to show before exiting. // 重新整理次數
-d num Seconds to wait between updates. // 重新整理間隔時間(預設5秒)
-s col Column to sort by <cpu,vss,rss,thr> // 按哪列排序
-t Show threads instead of processes. // 顯示線程資訊而不是進程
-h Display this help screen. // 顯示協助文檔
$ top -n 1
top -n 1
舉個例子:
查看前5個進程cup的使用方式
adb shell top -m 5 -s cpu
User 33%, System 8%, IOW 0%, IRQ 0%
User 340 + Nice 2 + Sys 83 + Idle 596 + IOW 6 + IRQ 0 + SIRQ 2 = 1029
PID PR CPU% S #THR VSS RSS PCY UID Name
27256 1 12% S 37 852340K 220296K fg u0_a25 fm.xiami.main
517 0 6% S 100 842940K 118832K fg system system_server
174 0 4% S 13 66532K 14000K fg media /system/bin/mediaserver
27767 0 2% S 11 673928K 50516K bg u0_a58 com.moji.mjweather
171 0 1% S 13 97904K 51964K fg system /system/bin/surfaceflinger
日誌說明:
User 35%, System 13%, IOW 0%, IRQ 0% // CPU佔用率
User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用方式
PID CPU% S #THR VSS RSS PCY UID Name // 進程屬性
xx xx% x xx xx xx xx xx xx
CPU佔用率:
User 使用者進程
System 系統進程
IOW IO等待時間
IRQ 硬停機時間
CPU使用方式(指一個最小時間片內所佔時間,單位jiffies。或者指所佔進程數):
User 處於使用者態的已耗用時間,不包含優先值為負進程
Nice 優先值為負的進程所佔用的CPU時間
Sys 處於核心態的已耗用時間
Idle 除IO等待時間以外的其它等待時間
IOW IO等待時間
IRQ 硬停機時間
SIRQ 非強制中斷時間
進程屬性:
PID 進程在系統中的ID
CPU% 當前瞬時所以使用CPU佔用率
S 進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。
#THR 程式當前所用的線程數
VSS Virtual Set Size 虛擬耗用記憶體(包含共用庫佔用的記憶體)
RSS Resident Set Size 實際使用實體記憶體(包含共用庫佔用的記憶體)
PCY OOXX,不知道什麼東東
UID 運行當前進程的使用者id
Name 程式名稱android.process.media
// ps:記憶體佔用大小有如下規律:VSS >= RSS >= PSS >= USS
// PSS Proportional Set Size 實際使用的實體記憶體(比例分配共用庫佔用的記憶體)
// USS Unique Set Size 進程獨自佔用的實體記憶體(不包含共用庫佔用的記憶體)
溫馨提示:
我們一般觀察Uss來反映一個Process的記憶體使用量情況,Uss 的大小代表了只屬於本進程正在使用的記憶體大小,這些記憶體在此Process被殺掉之後,會被完整的回收掉,
Vss和Rss對查看某一Process自身記憶體狀況沒有什麼價值,因為他們包含了共用庫的記憶體使用量,而往往共用庫的資源佔用比重是很大的,這樣就稀釋了對Process自身建立記憶體波動。 而Pss是按照比例將共用記憶體分割,某一Process對共用記憶體的佔用情況。
so
查看USS和PSS可以使用adb shell procrank,前提是手機需要root
adb shell procrank |grep xiami
如果只是查看PSS也可以使用adb shell dumpsys meminfo
adb shell dumpsys meminfo fm.xiami.main|grep TOTAL
TOTAL 143070 15312 130020 135179 122279 12667