android內存命令
㈠ android sdk 內存大小如何調整
如果是android的開發要設置sdk的虛擬內存,可以通過一下方式:
第一、刪除原有虛擬內存卡:先進入sdk的安裝文件夾下,裡面有個tools文件夾。手動刪除裡面的.img文件(這個就是設置虛擬內存大小的文件)
第二、新建需要大小的虛擬內存卡,通過DOS窗口進入tools文件夾下,使用命令>mksdcard[size]./msdcard.img,[size]就是設置虛擬內存卡大小(後面是以M為單位的),比如說以前的你是90M,現在你可以設置250M大小就可以使用命令:>mksdcard250M./msdcard.img。例如,下面是我設置的
㈡ Android內存的相關排查方法
mpsys meminfo 是Android系統提供的查詢內存命令,用該命令可以看到:
每個進程佔用的物理內存大小
系統內存分布狀態,包括
總的可用物理內存 Total RAM
當前可用物理內存 Free RAM
已用物理內存 Used RAM
不岩察可見內存 Lost RAM
比如輸入該命令後輸出如下日誌:
該命令列印的最後一部分,反應物嘩系統級別的內存狀況:
Total RAM: 1015868 kB
Free RAM: 638914 kB (105418 cached pss + 180168 cached + 353328 free)
Used RAM: 211428 kB (186096 used pss + 8008 buffers + 520 shmem + 16804 slab)
Lost RAM: 165526 kB
Tuning: 96 (large 256), oom 20480 kB, restore limit 6826 kB (high-end-gfx)
裡面某些欄位的意義需要注意:
mpsys meminfo
OOM Killer(Out Of Memory Killer) 是Linux當中,內存保護機制的一種。當物理內存幾乎耗盡而又需要分配新內存時,會殺掉一些優先順序低的進程,釋放內存。
LowMemoryKiller 是Android的內存保護機制。當物理內存低於閾值,就會殺掉一些優先順序低的進程,釋放內存。
聯系:LowMemoryKiller 用到了 OOM Killer 的評分機制
區別:LowMemoryKiller 是通過閾值觸發,OOM Killer 是分配內存失敗時觸發
評分原理:
oom_adj,代表進程的優先順序, 數值越大,優先順序越低,越容易被殺。系統分16個級別(取值范圍[-16, 15]整數,不連續)
通過 cat /proc/xxx/oom_adj 查看,其中xxx是進程號
oom_score_adj: 在 oom_adj 基礎上的評分,取值范圍[-1000, 1000]
通過 cat /proc/xxx/oom_score_adj 查看,其中xxx是進程號
閾值查看,以98mv100為例:
cat /sys/mole/lowmemorykiller/parameters/minfree
1024,1536,2048,3072,3584,4096
cat /sys/mole/lowmemorykiller/parameters/adj
0,58,117,176,529,1000
上訴數值表示:可用內存低於 4096 4K 時,殺掉 oom_score_adj>=1000 的應用;可用內存低於 3584 4K 時,殺掉 oom_score_adj>=529 的應用,以此類推。
因此,客戶可以通過調整 minfree 的閾值來觸發 LowMemoryKiller 更頻繁地殺應用,從而為高優先順序應用省下內存。
在 mpsys meminfo 中,GPU內存被統計到了 Lost RAM 裡面罩棗行了。
因此,當應用佔用GPU內存過高時,不會體現在 Used RAM 裡面,而是體現在 Lost RAM 中。反過來,如果發現有問題的時候 Lost RAM 很高,就需要看看GPU內存使用情況了。用以下命令:�
mount -t debugfs debugfs /sys/kernel/debug/
cat /sys/kernel/debug/mali/gpu_memory
130|root@MR820:/ # cat /sys/kernel/debug/mali/gpu_memory
Name (:bytes) pid mali_mem max_mali_mem external_mem ump_mem dma_mem
其中mali_mem列就是應用佔用的GPU內存
㈢ Android 常用adb命令
常用adb 命令
配置mat 環境,因為從 android profile直接獲取到的hprof文件格式與mat的格式不兼容,所以需要使用工具轉換一下
第 1 行:進程信息
總共(total):754個
運行中(running)狀態:1個
休眠(sleeping)狀態:753個
停止(stopped)狀態:0個
僵屍(zombie)狀態:0個
第 2 行:內存信息
5.5G total:物理內存總量
5.4G used:使用中的內存量
165M free:空閑內存量
76M buffers: 緩存的內存量
第 3 行:Swap分區信息
2.5G total:交換區總量
789M used:使用的交換區大小
1.7G free:空閑交換區大小
2.4G cached:緩沖的交換區大小
內存監控時,可以監控swap交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行內存和swap的數據交換,這是內存不夠用了。
第 4 行:CPU信息
800%cpu:8核cpu
100%user:用戶進程使用CPU佔比
3%nice:優先值為負的進程佔比
54%sys:內核進程使用CPU佔比
641%idle:除IO等待時間以外的其它等待時間佔比
0%iow:IO等待時間佔比
3%irq:硬中斷時間佔比
0%sirq:軟中斷時間佔比
第 5 行及以下:各進程的狀態監控
PID:進程id
USER:進程所屬用戶
PR:進程優先順序
NI:nice值,負值表示高優先順序,正值表示低優先順序
VIRT:進程使用的虛擬內存總量,VIRT=SWAP+RES
RES:進程使用的、未被換出的物理內存大小,RES=CODE+DATA
SHR:共享內存大小
S:進程狀態
%CPU:上次更新到現在的CPU佔用時間比
%MEM:使用物理內存佔比
TIME+:進程時間的CPU時間總計,單位1/100秒
ARGS:進程名
㈣ Android鑾峰彇搴旂敤鍐呭瓨浣跨敤鎯呭喌鐨勬柟娉
1銆 璇ヤ唬鐮佽幏鍙栧綋鍓嶅簲鐢ㄧ▼搴忕殑鍐呭瓨浣跨敤鎯呭喌ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); //鏈澶у垎閰嶅唴瀛 int memory = activityManager銆
getMemoryClass(); System銆俹ut銆俻rintln("memory: "+memory); //鏈澶у垎閰嶅唴瀛樿幏鍙栨柟娉2 float maxMemory = (float) (Runtime銆倈etRuntime()銆俶axMemory() * 1銆
0/ (1024 * 1024)); //褰撳墠鍒嗛厤鐨勬誨唴瀛 float totalMemory = (float) (Runtime銆倈etRuntime()銆倀otalMemory() * 1銆0/ (1024 * 1024)); //鍓╀綑鍐呭瓨 float freeMemory = (float) (Runtime銆
getRuntime()銆俧reeMemory() * 1銆0/ (1024 * 1024)); System銆俹ut銆俻rintln("maxMemory: "+maxMemory); System銆俹ut銆俻rintln("totalMemory: "+totalMemory); System銆
out銆俻rintln("freeMemory: "+freeMemory);緇撴灉System銆俹ut: memory: 256System銆俹ut: maxMemory: 256銆0System銆俹ut: totalMemory: 11銆974937System銆
out: freeMemory: 3銆6257935榪欒〃鏄庢垜鐨勫簲鐢ㄧ▼搴忓湪褰撳墠鎵嬫満涓婄殑鏈澶у垎閰嶅唴瀛樹負256m錛岀幇鍦ㄥ凡鍒嗛厤11m錛岃11m涓鐨6m鏄鍏嶈垂鐨勫綋鐒訛紝鎮ㄥ彲浠ラ氳繃Monitors鏇寸洿瑙傚湴鏌ョ湅鍐呭瓨浣跨敤鎯呭喌2銆 浣跨敤dos鍛戒護錛1錛夋墦寮dos紿楀彛騫舵墽琛宎db shell錛2錛塪umpsys meminfo杞浠跺寘鍚嶇О緇撴灉:3銆
浣跨敤鏄劇ず鍣ㄦ垨DDMS鏄劇ず鍣―DMS銆