Android ADB命令之內存統計與分析

一、核心命令總覽

工具 / 命令用途示例
adb shell dumpsys meminfo查看設備全局內存狀態adb shell dumpsys meminfo
adb shell dumpsys meminfo <package>獲取應用詳細內存分類統計adb shell dumpsys meminfo com.example.app
adb shell top動態查看進程內存和 CPU 占用adb shell top -m 10 -n 1
adb shell am dumpheap導出 Java Heap.hprof文件adb shell am dumpheap com.example.app /data/local/tmp/app.hprof
adb pull將 hprof 文件導出至本地分析adb pull /data/local/tmp/app.hprof ./
adb shell setprop libc.debug.malloc打開 native 分配追蹤adb shell setprop libc.debug.malloc backtrace
adb shell am send-trim-memory模擬系統觸發內存回收adb shell am send-trim-memory com.example.app TRIM_MEMORY_UI_HIDDEN

二、核心命令詳解與用例

1. adb shell dumpsys meminfo(全局內存)

作用:查看設備整體內存狀態,包括系統剩余內存、應用內存占用排名等。

adb shell dumpsys meminfo

關鍵輸出解析

Total RAM: 5,789,412K (status normal)Free RAM: 1,234,567K (  238,456K cached pss +   12,345K kernel)Used RAM: 3,456,789K (2,123,456K used pss + 1,333,333K kernel)Lost RAM:   987,654KZRAM:   123,456K physical used for   456,789K in swap (500,000K total swap)
字段說明
Total RAM設備物理內存總量
Free RAM可用內存 = 緩存進程內存 + 內核保留內存
Used RAM已用內存 = 應用實際使用量(PSS) + 內核占用
Lost RAM內存碎片或無法統計的內存
ZRAM壓縮交換分區使用情況(若啟用)

進程內存分類

Total PSS by OOM adjustment:543,052K: Native  # 原生進程286,850K: System  # 系統核心進程381,177K: Persistent  # 常駐進程(如SystemUI344,152K: Visible  # 可見進程245,108K: Perceptible  # 可感知進程(如后臺服務)91,710K: Backup  # 備份進程52,148K: Cached  # 緩存進程

內存類型分布

Total PSS by :510,454K: Native  # Native代碼內存247,842K: Dalvik  # Java堆內存154,596K: .art mmap  # ART運行時128,773K: .oat mmap  # AOT編譯代碼20,620K: Gfx dev  # 圖形內存

異常狀態檢測

  1. Low內存狀態status low表示系統處于內存緊張狀態

  2. ZRAM高使用:695MB/2.3GB的交換空間使用量(壓縮比≈3.6倍)

  3. 可疑進程

    • com.tencent.mm:push (73MB) 占用B Services
    • com.xiaomi.market (85MB) 占用Perceptible

建議腳本

# 監控高內存進程
adb shell dumpsys meminfo | grep -E "K: (Native|System|Persistent|Visible)" -A 3# 追蹤ZRAM變化
watch -n 1 'adb shell dumpsys meminfo | grep "ZRAM"'

2. adb shell dumpsys meminfo <package>(應用詳情)

作用:獲取指定應用的內存詳細分布,包括 Java/Native/Graphics 等。

adb shell dumpsys meminfo com.example.app

輸出示例

Applications Memory Usage (in Kilobytes):
Uptime: 15123 Realtime: 34253** MEMINFO in pid 12345 [com.example.myapp] **Pss  Private  Private  Swapped     Heap     Heap     HeapTotal    Dirty    Clean    Dirty     Size    Alloc     Free------   ------   ------   ------   -------  -------  -------Native Heap     8848     8844        0        0    32768    11234    21534Dalvik Heap     7832     7828        0        0    40960    15876    25084Dalvik Other     1523     1500        0        0Stack         96       96        0        0Ashmem          2        0        0        0Gfx dev       2492     2488        0        0Other dev     28       28        0        0.so mmap   4213        8     3324        0.apk mmap   1634        0     1234        0.ttf mmap     34        0       34        0.dex mmap   2090        0     2090        0Other mmap    228        0        4        0EGL mtrack    1020     1020        0        0GL mtrack    1832     1832        0        0Unknown     2202     2200        0        0TOTAL    43102    32844     6986        0    73728    27110    46618

字段逐項解釋

列名含義
Pss TotalProportional Set Size,總共享后按比例分配的內存大小(關鍵指標)
Private Dirty只屬于當前進程且被修改的內存頁,實際的獨占內存
Private Clean只屬于當前進程但未修改的頁(可能被回收)
Swapped Dirty被換出至 swap 空間的臟頁數(常見于低內存設備)
Heap SizeJava/Dalvik 堆的總大小
Heap Alloc已分配的堆內存大小
Heap Free堆中未分配的剩余空間

每一類內存段說明

區域說明
Native HeapC/C++ 層分配的堆,常由 malloc 或 native 層庫使用
Dalvik HeapJava 層內存(對象等)使用情況
Dalvik Other除了對象外的 Dalvik 使用,比如 Class Metadata
Stack每個線程的棧內存(通常為 1MB/線程)
AshmemAndroid 共享內存機制
Gfx dev/GL mtrack與圖形相關的內存,比如 UI、OpenGL 緩存等
.so mmap動態鏈接庫占用的內存
.apk/.dex/.ttf mmap被 mmap 映射的 APK/Dex/字體文件,不直接進入 Java Heap
EGL mtrackEGL 映射軌跡(GPU 分配追蹤)
Unknown未知來源的內存,常用于估算遺漏項

App Summary 段解釋

命令輸出后段通常還會出現以下摘要信息:

App SummaryPss(KB)Java Heap:  15234Native Heap:   8488Code:           8352Stack:             96Graphics:           4002Private Other:   1120System:          6789
項目說明
Java HeapJava 對象實際占用的堆內存(已分配)
Native HeapC 層 malloc 等 native 占用
Code.so/.dex/.apkmmap 映射的只讀代碼部分
Stack線程的棧空間
Graphics圖形緩沖區使用,如 Skia / SurfaceFlinger
Private Other無法明確歸類的私有內存段
System系統級別共享內存,如 binder、ashmem、zygote 映射等

實戰用法與技巧

  1. 快速定位內存占用高的進程
adb shell dumpsys meminfo | grep "TOTAL"

輸出每個進程的總內存占用,對比誰最占內存。

  1. 結合 top 使用,確認是否導致內存抖動
adb shell top -n 1 -m 10
adb shell dumpsys meminfo <package_name>

查看是否 Java Heap 或 Native Heap 正在持續上升。

  1. 導出分析數據備份
adb shell dumpsys meminfo com.example.app > meminfo.txt

保存為本地文本,配合 Git 歷史記錄查看趨勢。


注意事項

  • dumpsys meminfo 的數值僅代表瞬時快照,并非持續記錄
  • App 必須處于運行中,否則不會顯示完整信息
  • 不支持系統服務(如 system_server)的詳細堆棧分布
  • 若需要 GC 后的堆大小,建議先使用:
adb shell am send-trim-memory <package_name> TRIM_MEMORY_COMPLETE

推薦組合命令

adb shell dumpsys meminfo com.example.app > meminfo.txt
adb shell am dumpheap com.example.app /data/local/tmp/app.hprof
adb pull /data/local/tmp/app.hprof ./app.hprof

3. adb shell top(實時監控)

新增參數組合建議:

# 每2秒刷新一次,按內存排序
adb shell top -o RES -m 5 -d 2
參數作用
-o排序字段(RES=內存,%CPU=CPU)
-d刷新間隔(秒)
-m顯示最大進程數

4. adb shell setprop libc.debug.malloc(Native內存追蹤)

作用:啟用Bionic庫的malloc調試功能,記錄Native代碼的內存分配堆棧(需root權限或調試版ROM)

關鍵參數說明:

參數值作用
backtrace記錄每次分配的堆棧(默認16幀,可通過backtrace=32調整)
log輸出分配日志到/data/tombstones/malloc_debug_*
program=<name>僅追蹤指定進程(如app_process
options="backtrace,guard"組合選項(guard=啟用內存邊界檢查)

典型使用流程:

# 1. 啟用追蹤(需root或adb root)
adb shell stop
adb shell setprop libc.debug.malloc.program com.example.app
adb shell setprop libc.debug.malloc.options backtrace=32
adb shell start# 2. 復現問題后導出日志
adb pull /data/tombstones/malloc_debug_* ./# 3. 使用addr2line解析堆棧(需對應so庫的調試符號)
arm-linux-androideabi-addr2line -e libnative.so 0x1234 0x5678

輸出示例:

# malloc_debug_12345.txt 內容片段
@ 0xb6f04567 [com.example.app+0x123456]/project/jni/utils.cpp:42 malloc(1024)
@ 0xb6f089ab [com.example.app+0x789abc]/project/jni/image_processor.cpp:89 new ImageBuffer()

5. adb shell am send-trim-memory(內存壓力測試)

作用:模擬Android系統在不同內存壓力下的回收行為,驗證應用的內存管理策略

完整等級表:

等級參數系統行為典型觸發場景
TRIM_MEMORY_UI_HIDDEN通知Activity進入后臺用戶按Home鍵
TRIM_MEMORY_RUNNING_MODERATE釋放可緩存資源系統剩余內存<50%
TRIM_MEMORY_RUNNING_LOW停止后臺服務系統剩余內存<30%
TRIM_MEMORY_RUNNING_CRITICAL準備被殺死系統剩余內存<15%
TRIM_MEMORY_COMPLETE強制釋放所有非關鍵資源系統內存嚴重不足

自動化測試腳本示例:

# 模擬內存壓力升級過程
for level in UI_HIDDEN RUNNING_MODERATE RUNNING_LOW COMPLETE; doadb shell am send-trim-memory com.example.app TRIM_MEMORY_$levelsleep 3adb shell dumpsys meminfo com.example.app | grep "TOTAL PSS"
done

以下是補充 adb shell am dumpheap 命令后的完整內容,在保留原有 dumpsys meminfo 相關說明的基礎上,新增 dumpheap 的詳細說明:

6. adb shell am dumpheap(堆內存導出到文件)

1. 命令作用

am dumpheap 是 Android 的 Activity Manager (am) 工具提供的命令,用于將指定進程的 堆內存(Heap) 導出到文件,供后續分析(如檢測內存泄漏、對象分配情況等)。導出的文件是標準的 HPROF 格式,可用 Android Studio、MAT(Memory Analyzer Tool)等工具分析。

2. 命令語法

adb shell am dumpheap <pid|process_name> <file_path>
  • <pid|process_name> :目標進程的 PID 或包名(如 com.example.app)。
  • <file_path> :堆轉儲文件的保存路徑(需設備有寫入權限)。

3. 使用示例

示例 1:通過包名導出堆內存

adb shell am dumpheap com.example.app /data/local/tmp/heap.hprof

示例 2:通過 PID 導出堆內存

adb shell ps -A | grep com.example.app  # 先查找 PID
adb shell am dumpheap 1234 /sdcard/heap.hprof

示例 3:導出系統進程的堆內存(需 root)

adb shell su -c "am dumpheap system_server /data/local/tmp/system_heap.hprof"

4. 關鍵注意事項

  1. 文件路徑權限:

    • 默認情況下,普通應用無權寫入 /data/local/tmp 之外的系統目錄。
    • 建議導出到 /sdcard/(需設備有存儲權限)或通過 run-as 寫入應用私有目錄:
    • adb shell run-as com.example.app am dumpheap com.example.app /data/data/com.example.app/heap.hprof
      
  2. 進程凍結:

    • 執行 dumpheap 時,目標進程會被短暫凍結(STW,Stop-The-World),可能導致界面卡頓或 ANR(尤其在主線程轉儲時)。
  3. 文件拉取:

    • 導出的 .hprof 文件需通過 adb pull 復制到本地分析:

      adb pull /sdcard/heap.hprof ./
      
  4. HPROF 轉換:

    • Android 的 HPROF 是 Dalvik 格式,部分工具(如 MAT)需轉換為標準 Java HPROF:

      hprof-conv /path/to/android.hprof /path/to/java.hprof
      

      hprof-conv 工具位于 Android SDK 的 platform-tools 目錄)

5. 實際應用場景

  • 內存泄漏分析:結合 MAT 或 Android Studio Profiler 檢查對象引用鏈。
  • OOM 調試:在崩潰前主動轉儲堆內存,分析大對象分配。
  • 性能優化:對比不同操作前后的堆狀態,定位內存增長點。

6. 高級用法

  • 觸發 GC 后轉儲(減少噪聲):

    adb shell am dumpheap -g <pid> <file_path>
    

    -g 參數會在轉儲前觸發 GC,但部分設備可能不支持)

  • 自動化腳本

    adb shell am dumpheap $(pidof com.example.app) /sdcard/heap_$(date +%s).hprof
    

dumpsys meminfodumpheap 的區別

維度dumpsys meminfoam dumpheap
數據類型實時內存統計(PSS/RSS/堆大小等)完整的堆內存快照(對象引用關系)
用途快速查看內存占用概況深度分析內存泄漏或對象分配細節
性能影響幾乎無影響短暫凍結進程
輸出格式文本二進制 HPROF 文件

完整工作流程示例

  1. 通過 dumpsys meminfo 發現內存異常

    adb shell dumpsys meminfo com.example.app
    

    觀察到 Dalvik HeapPrivate Dirty 持續增長。

  2. 導出堆內存

    adb shell am dumpheap com.example.app /sdcard/suspicious_heap.hprof
    adb pull /sdcard/suspicious_heap.hprof ./
    
  3. 分析 HPROF 文件

    • 使用 Android Studio 的 Memory Profiler 導入文件。
    • 或通過 MAT 查找 Leak Suspects(內存泄漏嫌疑對象)。

通過結合 dumpsys meminfoam dumpheap,可以快速定位內存問題的宏觀表現(如總占用過高)和微觀細節(如具體泄漏對象)。


三、新增分析流程圖

Java內存泄漏
Native泄漏
整體偏高
發現內存問題
類型判斷
adb dumpheap + MAT分析
setprop malloc_debug + logcat
dumpsys meminfo分項對比
定位Retaining Path
分析malloc backtrace
優化Graphics/Code內存

四、實戰技巧補充

  1. 批量監控腳本
while true; doadb shell dumpsys meminfo com.example.app | grep "TOTAL PSS"sleep 5
done
  1. 內存泄漏黃金組合命令
# 1. 觸發GC后立即dump堆
adb shell am dumpheap -g com.example.app /data/local/tmp/app.hprof# 2. 同步時間戳便于關聯日志
adb shell date +%s > ./dump_time.txt# 3. 拉取文件并啟動MAT分析
adb pull /data/local/tmp/app.hprof ./ && memory-analyzer.sh app.hprof
  1. Native內存分析進階
# 需要root權限
adb shell stop
adb shell setprop libc.debug.malloc.program app_process
adb shell setprop libc.debug.malloc.options backtrace=32
adb shell start
  1. MAT快捷分析
  • 使用Leak Suspects報告快速定位問題
  • Retained Heap排序查看大對象
  1. Android Studio Profiler聯動
# 生成profiler可讀的快照
adb shell am profile start com.example.app /data/local/tmp/app.alloc
adb shell am profile stop com.example.app

五、版本差異與兼容性

Android版本Native追蹤支持Trim Memory等級關鍵內存指標
5.0-6.0需手動編譯libc僅前4個等級無Swap統計
7.0-8.1內置malloc_debug新增BACKGROUND引入SwapDirty
9.0+支持program過濾新增MODERATE獨立Graphics分類
12.0+優化backtrace性能新增CACHED_RECENT不可達對象統計

六、附錄:常用工具鏈

  1. MAT (Memory Analyzer Tool) :分析.hprof文件
  2. Android Studio Profiler:實時內存可視化
  3. Perfetto:系統級內存追蹤
  4. HeapTrack:Linux/Android通用堆分析工具
  5. Glibc Malloc Debug:NDK開發時使用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916632.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916632.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916632.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法思維進階 力扣 300.最長遞增子序列 暴力搜索 記憶化搜索 DFS 動態規劃 C++詳細算法解析 每日一題

目錄零、題目描述一、為什么這道題值得你深入理解&#xff1f;二、題目拆解&#xff1a;提取核心關鍵點三、明確思路&#xff1a;從暴力到優化的完整進化3. 進一步優化&#xff1a;動態規劃&#xff08;自底向上遞推&#xff09;4. 終極優化&#xff1a;貪心 二分查找&#xf…

圖解網絡-小林coding筆記(持續更新)

大綱 #mermaid-svg-trl6Q4B1uDO1z05w {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-trl6Q4B1uDO1z05w .error-icon{fill:#552222;}#mermaid-svg-trl6Q4B1uDO1z05w .error-text{fill:#552222;stroke:#552222;}#merm…

安寶特案例丨AR+AI+SOP?3大技術融合革新軍工航天領域

軍工、航空、航天領域存在 “小批量、多品種、依賴人工經驗裝配”的特性&#xff0c;這長期制約著生產效率與產品質量的提升。 技術融合應用案例 1 Arbigtec 裝配效率提升類&#xff1a; 某型導彈制導系統裝配&#xff1a;采用 AR 眼鏡與 AI 視覺引導系統&#xff0c;200 精…

ip link show 查看/配置網絡接口

ip link show&#xff08;或簡寫為 ip link&#xff09;是 Linux 系統中用于查看和配置網絡接口&#xff08;網卡、虛擬接口等&#xff09;的命令&#xff0c;屬于 iproute2 工具集的一部分。它是現代 Linux 系統中替代傳統 ifconfig 命令的更強大工具。命令詳解 基本語法 ip l…

電科金倉新一代數據庫一體機:以 “云數據庫 - AI 版” 引領 AI 時代數據庫變革

前言 AI時代的數據庫一體機市場&#xff0c;只能用兩個詞來形容&#xff1a;高手云集&#xff0c;戰況激烈&#xff01; 國際巨頭仍在高端市場占據主導地位&#xff0c;但在國產替代的沖擊下&#xff0c;也開始另尋突破口&#xff1b;國內科技大廠攻勢迅猛&#xff0c;通過開源…

IT運維的365天--033 跨交換機部署沒有單獨供電口的愛快AP到另一個地方去

前情提要&#xff1a;由于工作需要&#xff0c;領導要求在車間也添加一個無線網絡供員工和設備使用&#xff0c;之前公司已經有一個愛快網絡供員工使用&#xff0c;且物理隔絕部署在集團辦公樓這邊了。我一向是不喜歡碰到一個小事就拉一條網線&#xff0c;那樣不得搞的跟蜘蛛網…

Flutter開發實戰之路由與導航

第5章:路由與導航 在移動應用開發中,頁面間的跳轉是最基本也是最重要的功能之一。就像我們在現實生活中需要從一個房間走到另一個房間一樣,在App中,用戶需要在不同的界面間自由切換。Flutter提供了強大而靈活的路由系統來管理這些頁面跳轉,本章將深入探討Flutter的路由與…

Android 圖像編輯實戰指南:從基礎操作到進階效果

在移動應用中&#xff0c;圖像編輯功能已成為標配 —— 社交 APP 需要裁剪頭像&#xff0c;電商 APP 需要給商品圖加水印&#xff0c;工具 APP 需要提供濾鏡效果。看似簡單的 “裁剪”“縮放” 背后&#xff0c;實則涉及 Bitmap 像素操作、內存管理、性能優化等核心技術。很多開…

Java從入門到精通!第十八天(JDK17安裝以及網絡編程) 完結篇!!!

三、網絡編程1&#xff0e;網絡編程概述Java 是 Internet 上的語言&#xff0c;它從語言級上提供了對網絡應用程序的支持&#xff0c;程序員能夠很容易開發常見的網絡應用程序。2&#xff0e;網絡的基礎&#xff08;1&#xff09;計算機網絡把分布在不同地理區域的計算機與專門…

C++ STL常用容器總結(vector, deque, list, map, set)

C STL常用容器總結&#xff08;vector, deque, list, map, set&#xff09;1. vector&#xff08;動態數組&#xff09;特點定義和初始化常用操作遍歷方法2. deque&#xff08;雙端隊列&#xff09;特點定義和初始化常用操作3. list&#xff08;雙向鏈表&#xff09;特點定義和…

智能小車(F103C8T6)RT-THREAD版

前言 前面幾章學會了PWM,超聲波等&#xff0c;現在剛好結合起來控制智能小車 1&#xff1a;環境 KEIL5.38 RT-THREAD 3.1.3 STM32F103C8T6 2&#xff1a;硬件配件&#xff08;原來網上買的一套&#xff09; STM32F103C8T6 一個 MCU底板 一個 SG90 舵機 一個 紅外避障 2個 hc-…

Linux 遠程連接與文件傳輸:從基礎到高級配置

Linux 遠程連接與文件傳輸&#xff1a;從基礎到高級配置 在 Linux 系統管理中&#xff0c;遠程連接和文件傳輸是核心技能。SSH 協議提供了安全的遠程訪問方式&#xff0c;而基于 SSH 的 SFTP 和 SCP 則解決了跨服務器文件傳輸的需求。下面將詳細解析 SSH 服務配置、三種遠程操作…

17. 如何修改 flex 主軸方向

總結 flex-direction: row | row-reverse | column | column-reverse;一、作用說明 在 Flex 布局中&#xff0c;默認的主軸&#xff08;main axis&#xff09;方向是 水平向右&#xff08;即 row&#xff09;。 通過設置 flex-direction 屬性&#xff0c;可以靈活改變主軸的方向…

【Linux】重生之從零開始學習運維之mysql用戶管理

mariadb用戶管理創建用戶create user test210.0.0.% identified by 123456;用戶改名rename user test210.0.0.% to test310.0.0.%;用戶刪除 drop user test310.0.0.%;mysql用戶管理創建用戶create user test210.0.0.% identified by 123456;用戶改名rename user test210.0.0.% …

matlab小計

3.變量命名_嗶哩嗶哩_bilibili clc 清空頁面 文件名&#xff1a;字母開頭 clc:清除命令行窗口 clear all&#xff1a;清除工作區變量 編譯器里面 %%注釋 24 2-4 2*4 4/2 cumsum累計和 312 6123 movsum:滑窗計算數值 eg步長是3 1236 2349 6 9 ... 按列求最大值 先列…

getdents64系統調用及示例

getdents64 函數詳解 1. 函數介紹 getdents64 是 Linux 系統中用于讀取目錄內容的底層系統調用。可以把這個函數想象成一個"目錄內容掃描儀"——它能夠高效地掃描目錄中的所有文件和子目錄,就像超市的掃描槍快速讀取商品條碼一樣。 與高級的目錄操作函數(如 rea…

HBuilder X打包發布微信小程序

一、獲取AppId 二、獲取微信小程序AppId 三、發行->微信小程序&#xff0c;調起微信開發者工具 四、點擊上傳,上傳至微信公眾平臺 五、微信公眾平臺查看版本管理 完結&#xff01;&#xff01;&#xff01;

docker排查OOM

思路&#xff1a; 1.先從代碼程序上排查&#xff0c;線程池創建是否使用ThreadPoolExecutor&#xff0c;線程池各項設置是否合理。 任務對象是否釋放&#xff0c;網關是否需要限流。 2.服務器內存大小&#xff0c;cpu使用率&#xff0c;存儲空間大小&#xff0c;java程序啟動…

Web后端進階:springboot原理(面試多問)

1.配置優先級 3種配置文件: application.properties server.port8081application.yml server:port: 8082application.yaml server:port: 80822種外部屬性的配置(Java系統屬性、命令行參數): Java系統屬性配置 &#xff08;格式&#xff1a; -Dkeyvalue&#xff09; -Dserver.po…

第十天:字符菱形

每日一道C題&#xff1a;字符菱形 問題&#xff1a;給定一個字符&#xff0c;用它構造一個對角線長5個字符&#xff0c;傾斜放置的菱形。 要求&#xff1a;輸入只有一行&#xff0c; 包含一個字符&#xff1b;輸出該字符構成的菱形。 最基礎的做法&#xff1a; #include <io…