安卓内存信息查看

目录

  • 前言
  • 一、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>
相关推荐
百锦再37 分钟前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗1 小时前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO1 小时前
Android APP 热修复原理
android·app·frida·hotfix·热修复
火柴就是我2 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade2 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下2 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
青春给了狗4 小时前
Android 14 系统统一修改app启动时图标大小和圆角
android
pengyu5 小时前
【Flutter 状态管理 - 柒】 | InheritedWidget:藏在组件树里的"魔法"✨
android·flutter·dart
居然是阿宋6 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
凉、介6 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci