目录
- 前言
- 一、Android查看内存相关信息的方法
-
- [1.1 通过 adb shell 获取内存信息](#1.1 通过 adb shell 获取内存信息)
- [1.2 通过编程方式获取内存信息](#1.2 通过编程方式获取内存信息)
- [1.3 adb shell 获取应用程序内存使用情况](#1.3 adb shell 获取应用程序内存使用情况)
- 二、总结
前言
一、Android查看内存相关信息的方法
1.1 通过 adb shell 获取内存信息
c
C:\Users\henry.xue>adb shell
trinket:/ # cat proc/meminfo
MemTotal: 3711580 kB
MemFree: 607128 kB
MemAvailable: 2371444 kB
Buffers: 10980 kB
Cached: 1697644 kB
SwapCached: 0 kB
Active: 1107552 kB
Inactive: 1345780 kB
Active(anon): 745760 kB
Inactive(anon): 4916 kB
Active(file): 361792 kB
Inactive(file): 1340864 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Dirty: 2320 kB
Writeback: 0 kB
AnonPages: 744756 kB
Mapped: 666316 kB
Shmem: 5960 kB
Slab: 231564 kB
SReclaimable: 70964 kB
SUnreclaim: 160600 kB
KernelStack: 35616 kB
PageTables: 52180 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3952936 kB
Committed_AS: 90872212 kB
VmallocTotal: 263061440 kB
VmallocUsed: 75784 kB
VmallocChunk: 0 kB
CmaTotal: 208896 kB
CmaFree: 0 kB
参数详解:
- MemTotal:总内存大小,单位为 kB。
- MemFree:空闲内存大小,单位为 kB。表示当前未被使用的内存大小。
- MemAvailable:可用内存大小,单位为 kB。表示系统当前可用于分配给进程的内存大小,包括空闲内存和缓存内存。
- Buffers:缓冲区大小,单位为 kB。用于存放文件系统的缓冲区大小。
- Cached:缓存大小,单位为 kB。用于存放文件系统的缓存大小。
- SwapCached:交换缓存大小,单位为 kB。表示被交换到磁盘的内存页在内存中的缓存大小。
- Active:活跃内存大小,单位为 kB。表示当前正在使用的内存大小。
- Inactive:非活跃内存大小,单位为 kB。表示当前未被使用但仍然在内存中的内存大小。
- Active(anon):活跃的匿名内存大小,单位为 kB。表示当前正在使用的匿名内存大小。
- Inactive(anon):非活跃的匿名内存大小,单位为 kB。表示未被使用的匿名内存大小。
- Active(file):活跃的文件内存大小,单位为 kB。表示当前正在使用的文件内存大小。
- Inactive(file):非活跃的文件内存大小,单位为 kB。表示未被使用的文件内存大小。
- 其余参数包括 Dirty、Writeback、AnonPages、Mapped、Shmem、Slab、KernelStack、PageTables 等,分别表示不同类型的内存使用情况和内核数据结构占用的内存大小。
- SwapTotal:交换空间总大小,单位为 kB。表示系统中交换空间的总大小。
- SwapFree:可用交换空间大小,单位为 kB。表示系统中可用于交换的空间大小。
- CommitLimit:提交限制大小,单位为 kB。表示系统能够保证不会耗尽内存和交换空间的总可用空间大小。
- Committed_AS:已提交内存大小,单位为 kB。表示系统当前已分配但尚未使用的内存大小。
- VmallocTotal:虚拟内存总大小,单位为 kB。表示系统中虚拟内存的总大小。
- VmallocUsed:已使用的虚拟内存大小,单位为 kB。表示系统中已被使用的虚拟内存大小。
- VmallocChunk:虚拟内存块大小,单位为 kB。表示系统中虚拟内存的块大小。
- CmaTotal:连续内存分配总大小,单位为 kB。表示系统中用于连续内存分配的总大小。
- CmaFree:可用连续内存分配大小,单位为 kB。表示系统中可用于连续内存分配的大小。
1.2 通过编程方式获取内存信息
ActivityManager里的内部类MemoryInfo
java
public static class MemoryInfo implements Parcelable {
/**
* The available memory on the system. This number should not
* be considered absolute: due to the nature of the kernel, a significant
* portion of this memory is actually in use and needed for the overall
* system to run well.
*/
public long availMem;
/**
* The total memory accessible by the kernel. This is basically the
* RAM size of the device, not including below-kernel fixed allocations
* like DMA buffers, RAM for the baseband CPU, etc.
*/
public long totalMem;
/**
* The threshold of {@link #availMem} at which we consider memory to be
* low and start killing background services and other non-extraneous
* processes.
*/
public long threshold;
/**
* Set to true if the system considers itself to currently be in a low
* memory situation.
*/
public boolean lowMemory;
......
其中重要的四个参数:
- availMem: 系统上的可用内存。这个数字不应该被认为是绝对的:由于内核的性质,这个内存的很大一部分实际上正在使用,并且是整个系统正常运行所必需的。
- totalMem: 内核可访问的总内存。这基本上是设备的 RAM 大小,不包括内核下面的固定分配,如 DMA 缓冲区、基带 CPU 的 RAM 等。
- threshold: availMem 的阈值,在这个阈值以下,系统会认为内存较低,并开始终止后台服务和其他非必要进程。
- lowMemory: 如果系统认为当前处于低内存情况,则设置为 true。
java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
long totalMemory = memoryInfo.totalMem;
long availableMemory = memoryInfo.availMem;
这段代码将获取设备的总内存和可用内存信息。
1.3 adb shell 获取应用程序内存使用情况
- 使用以下命令可以查看应用程序的内存使用情况:
adb shell dumpsys meminfo <package_name>
- 将 <package_name> 替换为您要查看的应用程序包名,这将返回该应用程序的内存使用情况,包括堆内存、Native 内存等。
示例:
c
trinket:/ # dumpsys meminfo com.android.systemui
Applications Memory Usage (in Kilobytes):
Uptime: 85930415 Realtime: 85930415
** MEMINFO in pid 2027 [com.android.systemui] **
Pss Private Private Swap Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 27358 27308 0 0 33420 29399 4020
Dalvik Heap 6052 6008 0 0 11031 5516 5515
Dalvik Other 2273 2268 0 0
Stack 40 40 0 0
Ashmem 96 92 0 0
Gfx dev 4332 4332 0 0
Other dev 44 0 40 0
.so mmap 2982 88 76 0
.jar mmap 2108 0 192 0
.apk mmap 14337 0 11888 0
.ttf mmap 196 0 52 0
.dex mmap 173 4 168 0
.oat mmap 952 0 0 0
.art mmap 1583 1280 0 0
Other mmap 1645 476 108 0
EGL mtrack 3024 3024 0 0
GL mtrack 2964 2964 0 0
Unknown 1548 1544 0 0
TOTAL 71707 49428 12524 0 44451 34915 9535
App Summary
Pss(KB)
------
Java Heap: 7288
Native Heap: 27308
Code: 12468
Stack: 40
Graphics: 10320
Private Other: 4528
System: 9755
TOTAL: 71707 TOTAL SWAP (KB): 0
Objects
Views: 840 ViewRootImpl: 6
AppContexts: 16 Activities: 0
Assets: 14 AssetManagers: 0
Local Binders: 171 Proxy Binders: 67
Parcel memory: 22 Parcel count: 75
Death Recipients: 4 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
trinket:/ #
- Pss:Proportional Set Size,进程使用的物理内存大小,按比例分配共享库的内存。
- Private Dirty:进程使用的私有脏数据内存大小,表示进程独占的脏数据内存。
- Private Clean:进程使用的私有干净数据内存大小,表示进程独占的干净数据内存。
- Swap:被交换到磁盘的内存大小。
- Heap Size:堆内存总大小。
- Heap Alloc:已分配的堆内存大小。
- Heap Free:堆内存空闲大小。
在输出中,各个部分的含义如下:
- Native Heap:本地堆内存使用情况。
- Dalvik Heap:Dalvik 虚拟机堆内存使用情况。
- Dalvik Other:Dalvik 虚拟机其他内存使用情况。
- Stack:栈内存使用情况。
- Ashmem:共享内存使用情况。
- Gfx dev:图形设备内存使用情况。
- Other dev:其他设备内存使用情况。
- .so mmap:共享库内存映射使用情况。
- .jar mmap:Java 存档内存映射使用情况。
- .apk mmap:Android 应用程序包内存映射使用情况。
- .ttf mmap:TrueType 字体内存映射使用情况。
- .dex mmap:Dalvik 可执行文件内存映射使用情况。
- .oat mmap:ART 可执行文件内存映射使用情况。
- .art mmap:ART 内存映射使用情况。
- Other mmap:其他内存映射使用情况。
- EGL mtrack:EGL 内存使用情况。
- GL mtrack:图形库内存使用情况。
- Unknown:未知内存使用情况。
App Summary
- Java Heap:Java 堆内存的使用情况,占用了 7288KB 的内存。
- Native Heap:本地堆内存的使用情况,占用了 27308KB 的内存。
- Code:代码段的内存使用情况,占用了 12468KB 的内存。
- Stack:堆栈的内存使用情况,占用了 40KB 的内存。
- Graphics:图形相关的内存使用情况,占用了 10320KB 的内存。
- Private Other:其他私有内存的使用情况,占用了 4528KB 的内存。
- System:系统内存的使用情况,占用了 9755KB 的内存。
在总结部分:- TOTAL:所有上述部分的内存使用情况总和为 71707KB。
- TOTAL SWAP:交换空间(Swap)的使用情况为 0KB,表示当前没有使用交换空间。
Objects
Objects:这部分提供了应用程序中对象的相关统计信息。
- Views:视图对象的数量。
- ViewRootImpl:视图根对象的数量。
- AppContexts:应用程序上下文的数量。
- Activities:活动(Activity)对象的数量。
- Assets:资源对象的数量。
- AssetManagers:资源管理器对象的数量。
- Local Binders:本地 Binder 对象的数量。
- Proxy Binders:代理 Binder 对象的数量。
- Parcel memory:Parcel 内存使用情况。
- Parcel count:Parcel 对象的数量。
- Death Recipients:死亡接收者对象的数量。
- OpenSSL Sockets:OpenSSL 套接字对象的数量。
- WebViews:Web 视图对象的数量。
SQL
- SQL:这部分提供了与 SQL 数据库相关的内存使用情况。
- MEMORY_USED:数据库内存使用情况。
- PAGECACHE_OVERFLOW:页面缓存溢出情况。
- MALLOC_SIZE:分配大小。
二、总结
- adb shell cat proc/meminfo
- ActivityManager.MemoryInfo
- adb shell dumpsys meminfo < package_name>