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

本文详细介绍了在Android应用开发中如何通过日志、DDMS、adb等工具进行内存管理,包括垃圾回收过程的观察、内存使用情况的监控、内存泄漏的检测以及如何在代码中获取硬件RAM大小。此外,还提供了诊断内存问题的常用命令,帮助开发者优化应用性能。
1. 在IDE中查看Log信息
当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下:
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>

GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类:
    GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集
    GC_FOR_MALLOC:在内存已满的情况下分配内存,此时系统会暂停程序并回收内存
    GC_HPROF_DUMP_HEAP:创建FPFOR文件来分析Heap时所造成的垃圾收集
    GC_EXPLICIT: 程序调用了垃圾收集函数System.gc

    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>
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程序的内存使用情况:

重点关注如下几个字段:
(1) Native/Dalvik 的 Heap 信息
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

(2) Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。


4. 使用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


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


<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]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值