adb命令查看Android中内存使用情况

本文介绍如何使用ADB命令和Studio工具检查安卓应用的内存使用情况,包括dumpsys meminfo、procrank等命令的具体使用方法及解析,帮助开发者有效监控和优化程序内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用adb dumpsys命令

adb是一个非常强大的工具,使用adb查看程序内存使用情况可按如下格式在命令行里查看内存使用情况:
adb shell dumpsys meminfo <package_name> 

其中package_name可以换成程序的pid,pid可以通过adb shell top -n 1或者adb shell ps来查找,下图是某个程序的内存使用情况:
这里写图片描述
重点关注如下几个字段:
(1)Native/Dalvik 的Heap信息
具体在上面的第一行和第二行,它分别给出的是JNI层和java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄露。
(2)Total 的PSS信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占用内存比较大了。

2、使用adb shell procrank

手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。使用procrank时,命令行的输出入下图:
这里写图片描述
可以看到,在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

3、使用studio内存分析工具

前往简书查看

4、其它常用命令:

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

<think>我们正在讨论的是Android设备上osense(Oppo Sensor Framework)的内存使用情况。由于osense是OPPO设备上的一个系统服务,我们可以通过ADB命令查看内存使用情况。以下是一些步骤: 1. **获取osense服务的进程ID(PID)**: 首先,我们需要找到osense服务对应的进程。通常,这类服务运行在系统进程或单独的进程中。我们可以通过`adb shell ps`命令来查找与osense相关的进程。 2. **查看进程的内存信息**: 一旦获取到PID,我们可以使用`adb shell dumpsys meminfo <PID>`来查看该进程的详细内存使用情况。 3. **或者通过服务名称查找**: 我们也可以尝试通过服务名称来直接获取内存信息,但可能需要结合`dumpsys`命令。 具体步骤: ### 步骤1:查找osense相关进程 ```bash adb shell ps -A | grep -i osense ``` 或者,如果设备支持`pgrep`: ```bash adb shell pgrep -f osense ``` 如果找到进程,记录下PID。 ### 步骤2:查看进程内存信息 ```bash adb shell dumpsys meminfo <PID> ``` 将`<PID>`替换为实际的进程ID。 ### 步骤3:使用dumpsys直接查看服务内存(如果支持) 有些系统服务可以通过`dumpsys`直接查看内存,但osense可能没有专门的选项。我们可以尝试: ```bash adb shell dumpsys meminfo --package com.oppo.osense ``` 或者 ```bash adb shell dumpsys meminfo | grep -i osense ``` ### 步骤4:如果上述方法失败,尝试使用procrank(需要root) 如果设备已经root,可以使用`procrank`命令,它提供了更详细的内存信息(包括VSS、RSS、PSS、USS)。 ```bash adb shell su -c "procrank | grep -i osense" ``` ### 步骤5:通过/proc文件系统查看 通过/proc/<PID>/status文件可以查看进程的内存状态。 ```bash adb shell cat /proc/<PID>/status | grep -i vm ``` 或者查看`/proc/<PID>/smaps`(需要root)以获取更详细的内存映射。 ### 注意事项 - 由于osense是OPPO专有服务,不同设备版本可能有所不同。 - 部分命令需要root权限。 ### 示例输出解析 假设我们通过`ps`命令找到osense进程的PID为1234,则: ```bash adb shell dumpsys meminfo 1234 ``` 输出将包含: ``` Applications Memory Usage (in Kilobytes): Uptime: 1234567 Realtime: 1234567 ** MEMINFO in pid 1234 [com.oppo.osense] ** Pss Private Private SwapPss Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 12345 12000 345 50 15600 13000 2600 Dalvik Heap 2345 2300 0 10 3500 3000 500 ...(其他内存区域)... ``` 其中,我们关注: - **Pss**:按比例分摊的内存占用(实际物理内存) - **Private Dirty**:私有脏内存(不能被交换出去,且进程独占) - **Heap Alloc**:堆内存分配量 ### 相关问题 §§相关问题§§ 1. 如何通过ADB命令监控Android应用的内存泄漏? 2. Android系统服务的内存使用情况如何分析? 3. 如何通过ADB命令获取Android设备的整体内存使用情况? 4. 在Android开发中,有哪些工具可以分析内存使用? 5. 如何在不使用root权限的情况下获取应用的内存信息?</think>### 通过ADB查看osense内存使用情况的完整指南 osense(O-Sense框架)作为OPPO设备的传感器管理系统,其内存使用情况可通过以下ADB命令查看: --- #### 🔍 步骤1:定位osense进程PID ```bash adb shell ps -A | grep -i osense ``` 输出示例: `u0_a123 4567 789 /system/bin/com.oppo.osense` **PID = 4567**(第二列数字)[^1] --- #### 📊 步骤2:查看详细内存使用(需root) ```bash adb shell su -c "dumpsys meminfo 4567" ``` 关键指标解析: | 指标 | 说明 | 数学表达式 | |------|------|-----------| | **PSS** | 实际物理内存 | $\frac{\text{私有内存} + \text{共享内存}}{\text{共享进程数}}$ | | **RSS** | 驻留内存集 | $\sum \text{物理页帧大小}$ | | **Heap Alloc** | 堆内存分配 | $H_{\text{alloc}} = H_{\text{total}} - H_{\text{free}}$ | 典型输出: ``` ** MEMINFO in pid 4567 [com.oppo.osense] ** Pss Private Heap Heap Heap Total Dirty Size Alloc Free ------ ------ ------ ------ ------ Native Heap 12000 11800 15000 13000 2000 Dalvik Heap 3500 3480 4000 3800 200 ``` --- #### ⚙️ 步骤3:监控实时内存变化 ```bash adb shell watch -n 1 "dumpsys meminfo 4567 | grep -E 'Pss|Heap'" ``` 每1秒刷新一次,输出示例: `Pss Total: 15500 → Heap Alloc: 13200 → Private Dirty: 15280` --- #### 📈 步骤4:分析内存映射(高级) ```bash adb shell su -c "cat /proc/4567/smaps | grep -A10 osense" ``` 解析关键区域: - `.so`:动态库内存 - `.dex`:Dalvik代码内存 - `anon`:堆内存块 --- #### ⚠️ 注意事项 1. **权限要求**:完整内存数据需要`root`权限(`su -c`) 2. **设备兼容性**:仅OPPO/realme/一加等ColorOS设备有效 3. **内存单位**:输出数据单位为**KB** 4. **PSS vs RSS**: - PSS更反映真实内存负担 - RSS包含共享库重复计数 --- #### 💡 替代方案(无root) ```bash adb shell dumpsys meminfo | grep -i sensor ``` 可查看传感器服务整体内存(包含osense),但无法单独分离[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值