一引瀑、 通過(guò)eclipse,ADT開(kāi)發(fā)工具的DDMS來(lái)查看(Heap)
在“Devices”窗口中選擇模擬器中的一個(gè)需要查看的程序咐容,從工具條中選“Update heap”按鈕执俩,給這個(gè)程序設(shè)置上“heap Updates”,然后在Heap視圖中點(diǎn)擊Cause GC就可以實(shí)時(shí)顯示這個(gè)程序的一些內(nèi)存和cpu的使用情況了篱竭。
然后就會(huì)出現(xiàn)如下界面:
說(shuō)明: a) 點(diǎn)擊“Cause GC”按鈕相當(dāng)于向虛擬機(jī)請(qǐng)求了一次gc操作力图; b) 當(dāng)內(nèi)存使用信息第一次顯示以后,無(wú)須再不斷的點(diǎn)擊“Cause GC”掺逼,Heap視圖界面會(huì)定時(shí)刷新吃媒,在對(duì)應(yīng)用的不斷的操作過(guò)程中就可以看到內(nèi)存使用的變化; c) 內(nèi)存使用信息的各項(xiàng)參數(shù)根據(jù)名稱(chēng)即可知道其意思,在此不再贅述赘那。
大致解析如下:
這個(gè)就是當(dāng)前應(yīng)用的內(nèi)存占用刑桑,allocated 是已經(jīng)分配的內(nèi)存 free是空閑內(nèi)存,
heap size 是虛擬機(jī)分配的 不是固定值 heap size 的最大值跟手機(jī)相關(guān)的
有網(wǎng)友說(shuō)募舟,
一般看1byte的大部分就是圖片占用的
如何判斷應(yīng)用是否有內(nèi)存泄漏的可能性呢祠斧?
需要注意一個(gè)值:Heap。視圖中部有一個(gè)Type叫做data object拱礁,即數(shù)據(jù)對(duì)象琢锋,也就是我們的程序中大量存在的類(lèi)類(lèi)型的對(duì)象。在data object一行中有一列是“Total Size”呢灶,其值就是當(dāng)前進(jìn)程中所有Java數(shù)據(jù)對(duì)象的內(nèi)存總量吴超,一般情況下,這個(gè)值的大小決定了是否會(huì)有內(nèi)存泄漏鸯乃【ㄗ瑁可以這樣判斷:
a) 不斷的操作當(dāng)前應(yīng)用,同時(shí)注意觀(guān)察data object的Total Size值飒责;
b) 正常情況下Total Size值都會(huì)穩(wěn)定在一個(gè)有限的范圍內(nèi)赘娄,也就是說(shuō)由于程序中的的代碼良好,沒(méi)有造成對(duì)象不被垃圾回收的情況宏蛉,所以說(shuō)雖然我們不斷的操作會(huì)不斷的生成很多對(duì) 象,而在虛擬機(jī)不斷的進(jìn)行GC的過(guò)程中性置,這些對(duì)象都被回收了拾并,內(nèi)存占用量會(huì)會(huì)落到一個(gè)穩(wěn)定的水平;
c) 反之如果代碼中存在沒(méi)有釋放對(duì)象引用的情況鹏浅,則data object的Total Size值在每次GC后不會(huì)有明顯的回落嗅义,隨著操作次數(shù)的增多Total Size的值會(huì)越來(lái)越大, 直到到達(dá)一個(gè)上限后導(dǎo)致進(jìn)程被kill掉隐砸。
d) 此處已system_process進(jìn)程為例之碗,在我的測(cè)試環(huán)境中system_process進(jìn)程所占用的內(nèi)存的data object的Total Size正常情況下會(huì)穩(wěn)定在2.2~2.8之間,而當(dāng)其值超過(guò)3.55后進(jìn)程就會(huì)被kill季希。
在如下的位置:
二褪那、通過(guò)linux命令來(lái)查看
使用adb dumpsys 命令
adb是一個(gè)非常強(qiáng)大的工具,使用adb查看應(yīng)用程序內(nèi)存使用情況可按如下格式在命令行里查看內(nèi)存使用情況:
adb shell dumpsys meminfo <package_name>
或者adb shell top | grep <package_name> 也可以看內(nèi)存
其中式塌,package_name 也可以換成程序的pid博敬,pid可以通過(guò)adb shell ps | grep "xx"來(lái)查找;
下圖是某個(gè)程序的內(nèi)存使用情況:
重點(diǎn)關(guān)注如下幾個(gè)字段:
(1) Native/Dalvik 的 Heap 信息具體在上面的第一行和第二行峰尝,它分別給出的是JNI層和Java層的內(nèi)存分配情況偏窝,如果發(fā)現(xiàn)這個(gè)值一直增長(zhǎng),則代表程序可能出現(xiàn)了內(nèi)存泄漏。
(2) Total 的 PSS 信息這個(gè)值就是你的應(yīng)用真正占據(jù)的內(nèi)存大小祭往,通過(guò)這個(gè)信息伦意,你可以輕松判別手機(jī)中哪些程序占內(nèi)存比較大了。
常用的命令有
adb shell
ps 是看進(jìn)程的
top命令是看占用率的
內(nèi)存耗用:VSS/RSS/PSS/USS 的介紹
VSS - Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
RSS - Resident Set Size 實(shí)際使用物理內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
PSS - Proportional Set Size 實(shí)際使用的物理內(nèi)存(比例分配共享庫(kù)占用的內(nèi)存)
USS - Unique Set Size 進(jìn)程獨(dú)自占用的物理內(nèi)存(不包含共享庫(kù)占用的內(nèi)存)
一般來(lái)說(shuō)內(nèi)存占用大小有如下規(guī)律:VSS >= RSS >= PSS >= USS
(具體VSS RSS >= PSS >= USS)