使用showmap分析android进程内存占用情况

本文介绍了如何通过adbshellshowmappid命令查看Android进程中的内存占用情况,包括虚拟大小、RSS、PSS等关键指标,并详细解释了Shared_Clean、Shared_Dirty、Private_Clean、Private_Dirty等概念。文章还提供了对象(库)的统计,帮助开发者了解进程内各库的使用情况。

可以使用adb shell showmap pid查看一个进程的showmap,这对于我们来说非常有用,可以确定进程中哪些库占用内存比较多。


virtual size, RSS,PSS可以参考 http://blog.youkuaiyun.com/adaptiver/article/details/7084364

Shared_Clean和其他进程共享的未改写页面;

Shared_Dirty和其他进程共享的已改写页面;

Private_Clean未改写的私有页面;

Private_Dirty已改写的私有页面;

其中Dirty页面如果没有交换机制的情况下,应该是不能回收的。

#Object指的是进程里有多少个对象(库),后面是对象或库的名称。

### 使用 `adb shell showmap` 查看类的内存占用情况 `adb shell showmap` 是一个用于查看特定进程内存映射的工具。它能够详细列出进程所依赖的共享库(`.so` 文件)以及它们在内存中的分配情况。虽然该命令本身不能直接显示类的内存占用,但可以通过分析 `.so` 库的内存使用情况间接推断出某些类或模块的内存消耗。 #### 具体方法 1. **确定目标进程的 PID** 使用 `adb shell procrank` 或 `adb shell ps` 命令获取目标应用的进程 ID(PID)。例如: ```bash adb shell procrank | grep "目标包名" ``` 或者: ```bash adb shell ps | grep "目标包名" ``` 2. **执行 `showmap` 命令** 使用以下命令查看指定 PID 的内存映射信息: ```bash adb shell showmap <PID> ``` 例如,如果目标进程的 PID 为 20193,则运行: ```bash adb shell showmap 20193 ``` 3. **输出解析** 输出结果会列出所有与该进程相关的内存映射条目,包括以下内容: - **Address Range**: 内存地址范围。 - **Size**: 映射区域的大小(单位通常为 KB)。 - **Rss**: 实际使用的物理内存大小。 - **Pss**: 按比例分配的物理内存大小。 - **Shared_Clean/Shared_Dirty**: 共享内存的清洁和脏数据部分。 - **Private_Clean/Private_Dirty**: 私有内存的清洁和脏数据部分。 - **Mapping Name**: 映射的文件名或匿名内存区域名称。 示例输出片段: ``` Address Size Rss Pss Referenced Anonymous SwapPss Dirty Locked Mapping ... 7f8e5c0000-7f8e5d6000 r-xp 00000000 00:00 0 /data/app/com.example.app/lib/arm64/libexample.so 7f8e5d6000-7f8e5da000 r--p 00016000 00:00 0 /data/app/com.example.app/lib/arm64/libexample.so 7f8e5da000-7f8e5db000 rw-p 0001a000 00:00 0 /data/app/com.example.app/lib/arm64/libexample.so ... ``` 在此示例中,`libexample.so` 是一个动态链接库文件,其内存使用情况被细分为多个区域(如代码段、只读数据段、可写数据段等)。通过这些信息可以推测出与该库相关的类或功能模块的内存消耗。 4. **过滤特定类的内存占用** 如果需要关注某个特定类的内存占用,可以通过以下步骤进行: - 找到加载该类的 `.so` 库文件名。 - 使用 `grep` 过滤相关 `.so` 库的内存映射信息: ```bash adb shell showmap <PID> | grep "libexample.so" ``` #### 注意事项 - `adb shell showmap` 主要用于分析动态链接库的内存占用,而无法直接显示 Java/Kotlin 类的内存分配情况。若需要查看 Java 层对象的内存占用,建议使用 `dumpsys meminfo` 或 Android Profiler 工具[^1]。 - 如果目标设备上未安装 `showmap` 工具,可以通过重新编译系统镜像或使用其他替代工具(如 `procmem`)来实现类似功能[^2]。 ```python # 示例 Python 脚本:自动化提取 showmap 输出中特定库的内存信息 import subprocess def get_showmap_info(pid, library_name): result = subprocess.run(['adb', 'shell', 'showmap', str(pid)], stdout=subprocess.PIPE) output = result.stdout.decode('utf-8') filtered_output = [line for line in output.splitlines() if library_name in line] return filtered_output pid = 20193 library_name = "libexample.so" memory_info = get_showmap_info(pid, library_name) for line in memory_info: print(line) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值