使用meminfo分析Android单个进程内存信息

本文介绍如何使用adb shell dumpsys meminfo命令查看Android应用进程的内存使用情况,包括Native Heap、Dalvik Heap和其他内存类型的具体统计信息,并解释了各个参数的含义。

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

可以使用adb shell dumpsys meminfo -a <process id>/<process name>来查看一个进程的memory。截图如下:

Naitve Heap Size: 从mallinfo usmblks获得,代表最大总共分配空间

Native Heap Alloc: 从mallinfo uorblks获得,总共分配空间

Native Heap Free: 从mallinfo fordblks获得,代表总共剩余空间 

Native Heap Size 约等于Native Heap Alloc + Native Heap Free

mallinfo是一个C库, mallinfo 函数提供了各种各样的通过C的malloc()函数分配的内存的统计信息。

Dalvik Heap Size:从Runtime totalMemory()获得,Dalvik Heap总共的内存大小。

Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的内存大小。

Dalvik Heap Free:从Runtime freeMemory()获得,Dalvik Heap剩余的内存大小。

Dalvik Heap Size 约等于Dalvik  Heap Alloc + Dalvik  Heap Free

OtherPss, include Cursor,Ashmem, Other Dev, .so mmap, .jar mmap, .apk mmap, .ttf mmap, .dex mmap, Other mmap, Unkown统计信息都可以在process的smap文件看到。

Objects and SQL 信息都是从Android Debug信息中获得。

其他类型               smap 路径名称          描述

Cursor                  /dev/ashmem/Cursor  Cursor消耗的内存(KB)

Ashmem               /dev/ashmem            匿名共享内存用来提供共享内存通过分配一个多个进程

                                                         可以共享的带名称的内存块

Other dev             /dev/                        内部driver占用的在 “Other dev”                                                 

.so mmap             .so                            C 库代码占用的内存

.jar mmap            .jar                           Java 文件代码占用的内存

.apk mmap           .apk                           apk代码占用的内存

.ttf mmap              .ttf                           ttf 文件代码占用的内存

.dex mmap             .dex                         Dex 文件代码占用的内存

Other mmap                                          其他文件占用的内存

参考:

http://man7.org/linux/man-pages/man3/mallinfo.3.html

http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html

http://gee.cs.oswego.edu/pub/misc/malloc.h

http://www.redwolf-blog.com/?p=882

### 如何在 Android 中查询当前使用内存量 为了查询 Android 设备上当前应用程序的内存使用情况,可以利用 `ActivityManager` 和 `Debug.MemoryInfo` 类来实现这一功能。下面展示了具体的实现方式。 #### 使用 ActivityManager 查询内存信息 通过获取 `ActivityManager` 服务并调用其方法可以获得有关设备内存信息: ```java import android.app.ActivityManager; import android.content.Context; // 获取 ActivityManager 服务实例 ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); if (activityManager != null) { // 创建一个 MemoryInfo 对象用于存储内存数据 ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); // 填充 MemoryInfo 结构体中的字段 activityManager.getMemoryInfo(memoryInfo); // 手机系统的物理内存总量(字节) long totalMem = memoryInfo.totalMem; // 系统可用内存(字节) long availMem = memoryInfo.availMem; // 当前系统是否被认为处于低内存状态 boolean isLowMemory = memoryInfo.lowMemory; } ``` 这段代码能够帮助开发者了解整个系统的总内存以及剩余可分配给新进程或现有进程扩展的空间量[^4]。 #### 获取特定进程中各组件的私有脏页数 对于更详细的单个应用级别的内存统计,还可以借助于 `Debug.MemoryInfo` 来获得更加精确的数据: ```java import android.os.Debug; List<Debug.MemoryInfo> processMemoryInfos = Debug.MemoryInfo.getAllMemoryInfo(); for(Debug.MemoryInfo memInfo : processMemoryInfos){ int pid = memInfo.pid; // 进程ID // 私有的脏页面数量(单位:KB),这部分代表了该进程独占的部分 long privateDirtyPagesInKb = memInfo.getTotalPss() * 1024L; } ``` 这里提供了关于每个正在运行的应用程序的具体内存消耗详情,特别是那些由它自己创建而未与其他任何其他进程共享的对象所占据的空间大小[^1]。 需要注意的是上述两种方法分别适用于不同场景下的需求;前者适合用来监控全局性的资源状况变化趋势,后者则更适合做性能优化方面的诊断工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值