安卓内存信息查看

目录

  • 前言
  • 一、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>
相关推荐
CYRUS STUDIO6 分钟前
ARM64汇编寻址、汇编指令、指令编码方式
android·汇编·arm开发·arm·arm64
weixin_449310841 小时前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
Zender Han1 小时前
Flutter自定义矩形进度条实现详解
android·flutter·ios
白乐天_n3 小时前
adb:Android调试桥
android·adb
姑苏风7 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
数据猎手小k10 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小1011 小时前
JavaWeb项目-----博客系统
android
风和先行11 小时前
adb 命令查看设备存储占用情况
android·adb
AaVictory.12 小时前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
似霰13 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder