編輯:關於Android編程
GC_EXTERNAL_ALLOC: 出現在API 10及以下,為外部分配內存(native memory or NIO buffer)所造成的垃圾回收,高版本全部分配在Dalvik Heap中。
Amount_freed 表示此次回收的內存
Heap_stats 表示空閒內存百分比和存活對象大小/堆的總大小
External_memory_stats 表示API 10及以下的外部分配內存,已分配內存/導致垃圾回收的界限
Pause_time 暫停時間,一個表示開始回收垃圾的時間,另一個表示回收結束的暫停時間
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
注意這條信息中的 “ 3571K/9991K” 值,這代表著程序使用的heap大小。
2.使用DDMS
Eclipse中的DDMS提供了一個觀察內存使用情況的GUI,當我們不斷點擊Cause GC時,就會看到當前程序的Heap,使用比較方便,具體用法可以Google一下。
3.使用adb dumpsys 命令
adb是一個非常強大的工具,使用adb查看應用程序內存使用情況可按如下格式在命令行裡查看內存使用情況:
adb shell dumpsys meminfo
其中,package_name 也可以換成程序的pid,pid可以通過 adb shell top | grep app_name 來查找,下圖是某個程序的內存使用情況:
重點關注如下幾個字段:
(1) Native/Dalvik 的 Heap 信息
具體在上面的第一行和第二行,它分別給出的是JNI層和Java層的內存分配情況,如果發現這個值一直增長,則代表程序可能出現了內存洩漏。
(2) Total 的 PSS 信息
這個值就是你的應用真正占據的內存大小,通過這個信息,你可以輕松判別手機中哪些程序占內存比較大了。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+NC4gyrnTw2FkYiBzaGVsbCBwcm9jcmFuazwvc3Ryb25nPjxicj4Kyta7+tbQtcRzaMrHvq25/b6rvPK5/bXEo6zT0NCpyta7+r/JxNzDu9PQIHByb2NyYW5rIMP8we6jrL/J0tTKudPDZ2VueW1vdGlvbsSjxOLG96Osu/LKx9fUvLqwstewcHJvY3JhbmvD/MHuoaPKudPDcHJvY3JhbmvKsaOsw/zB7tDQtcTK5LP2yOvPws28o7o8L3A+CjxwPjxpbWcgc3JjPQ=="/uploadfile/Collfiles/20140629/2014062910055981.jpg" alt="\">
可以看到,在linux下表示內存的耗用情況有四種不同的表現形式:
VSS - Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)
RSS - Resident Set Size 實際使用物理內存(包含共享庫占用的內存)
PSS - Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存)
USS - Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存)
VSS:VSS表示一個進程可訪問的全部內存地址空間的大小。這個大小包括了進程已經申請但尚未使用的內存空間。在實際中很少用這種方式來表示進程占用內存的情況,用它來表示單個進程的內存使用情況是不准確的。
RSS:表示一個進程在RAM中實際使用的空間地址大小,包括了全部共享庫占用的內存,這種表示進程占用內存的情況也是不准確的。
PSS:表示一個進程在RAM中實際使用的空間地址大小,它按比例包含了共享庫占用的內存。假如有3個進程使用同一個共享庫,那麼每個進程的PSS就包括了1/3大小的共享庫內存。這種方式表示進程的內存使用情況較准確,但當只有一個進程使用共享庫時,其情況和RSS一模一樣。
USS:表示一個進程本身占用的內存空間大小,不包含其它任何成分,這是表示進程內存大小的最好方式!
可以看到:VSS>=RSS>=PSS>=USS
5.其它常用命令命令:
adb shell kill PIDNumber 死你想殺死的後台進程來模擬某種 bug 的復現條件。
adb shell ps 查看當前終端中的進程信息
那麼如何在代碼中判斷當前的硬件系統有多少的 RAM 呢?在 Framework ProcessList.java 中有如下代碼可用:
ProcessList() {
MemInfoReader minfo = new MemInfoReader();
minfo.readMemInfo();
mTotalMemMb = minfo.getTotalSize()/(1024*1024);
}
查看進程占用cpu的情況:adb shell top -n 1 -d 0.5 " grep proc_ id
步驟: 1. 下載android 4.4源碼包, 由於GFW原因, 通過谷歌官方網站repo下載源碼比較難, 所以我選擇了國內android
接著上篇文章,現在在通過Android實際開發和源碼再探觀察者模式,listview是我們日常開發中必用的控件,雖然之前就有listview的替代品(recyclervi
本文實例講述了Android開發之多線程中實現利用自定義控件繪制小球並完成小球自動下落功能的方法。分享給大家供大家參考,具體如下:1、布局界面<RelativeLa
最近研究怎麼讓自己的程序節省幾行代碼。仔細想一想,我們在做客戶端類的APP時,最基礎,大量重復的場景就是:1.從服務器請求數據2.解析得到的數據並處理加以封裝3.將封裝好