"adb shell dumpsys meminfo my-app-name"中个人资料的详细说明?

use*_*093 14 android embedded-linux android-ndk android-emulator

任何人都可以给我一个关于获得的个人资料的详细解释adb shell dumpsys meminfo my-app-name吗?

结果如下所述,如何在Android中发现我的应用程序的内存使用情况?:

** MEMINFO in pid 890 [process-name] **
                    native   dalvik    other    total
            size:    10940     7047      N/A    17987
       allocated:     8943     5516      N/A    14459
            free:      336     1531      N/A     1867
           (Pss):     4585     9282    11916    25783
  (shared dirty):     2184     3596      916     6696
    (priv dirty):     4504     5956     7456    17916

 Objects
           Views:      149        ViewRoots:        4
     AppContexts:       13       Activities:        0
          Assets:        4    AssetManagers:        4
   Local Binders:      141    Proxy Binders:      158
Death Recipients:       49
 OpenSSL Sockets:        0

 SQL
            heap:      205          dbFiles:        0
       numPagers:        0   inactivePageKB:        0
    activePageKB:        0
Run Code Online (Sandbox Code Playgroud)

每列(native,dalvik,other,total)是什么意思?特别是什么是"其他"专栏(我无法弄清楚除了本地和dalvik之外还有什么)?如果有人可以举一个具体的例子来详细说明这一点,那就太好了.例如,我有一个应用程序A. A有自己的对象obj_private和它自己的本机库lib_private.此外,A引用了Android框架obj_shared的一些对象和Android框架lib_shared的一些本机库.并且obj_shared引用了一些Android lib_shared_indirect的本地库.对于这种情况,我可以说那些吗?

  1. "总大小"等于"obj_private + lib_private + obj_shared + lib_shared + lib_shared_indirect"使用的所有内存.
  2. "私人脏"等于被"obj_private + lib_private"弄脏的内存

我们想要明确这一点的原因是:与以前的版本相比,我们的最新版本应用程序有一些不寻常的运行时内存增加.当我使用dumpsys meminfo时,我发现列"本机"和"其他"显着增加.但是新版本的更改只与java有关,而且没有关于"其他"列的解释.我用Google搜索了这个,没有找到任何文件.我也尝试阅读adb的源代码.但我发现很容易迷失在像我这样的新手的源代码中.所以我在这里发布这个问题以防有人可以提供帮助.

hac*_*bod 11

我们现在有更多关于Android中RAM使用的文档,其中详细介绍了不同RAM编号的含义:管理应用程序的内存.特别是,请查看此处页面的中间部分,讨论meminfo转储的关键部分:调查RAM使用情况.

在我们确定许多不同类型的分配之前,看起来您的meminfo输出来自相当旧版本的Android.要将您所看到的内容映射到当前文档,只需将"其他"视为现代转储除了native和dalvik部分之外的所有内容.在您的转储中,我相信您的dalvik部分实际上是现代的"Dalvik堆"和"Dalvik其他"放在一起.

对于本机和其他部分,只有在Java代码发生变化之后,这肯定会发生.Android Java API的许多部分位于本机分配之上,并且还可以导致其他分配.这个经典的例子是Gingerbread和之前的位图,其中位图的数据是本机分配,而不是像今天这样在Java堆中的数组分配.

增加的其他分配可能是由于您将在最新版本的数据中列出的许多内容 - 内存支持游标,来自ashmem的共享内存区域,为您分配内容的设备(如图形纹理等).有很多事情很难说可能会发生什么,这就是为什么这些日子报告更加详细.(即使在那里,我们仍然有许多事情被淹没到未知之中.)

为了进行调试,您可能希望查看Java堆中的泄漏对象.由于对象的实际分配不在Java堆中,因此当然这可能很棘手.我建议您在应用程序的早期进行堆转储,执行任何导致其RAM占用空间增加的操作,在此之后执行堆转储,并查找已增加的对象数.引用的文档显示了如何将堆转储与MAT进行比较.

此外,当您将Java堆视为一般分析时(除了执行差异时),请务必按照其中的说明去除堆的zygote部分.正如文档所提到的,每个进程都有来自zygote的大量分配,但这些分配在所有进程中共享,因此通常与堆分析无关.我经常看到有人担心,因为他们在他们的应用程序中看到很多非常大的位图,系统似乎已经分配给他们,并且认为这是在他们的应用程序中使用RAM的主要事情,当它不是时,它只是来自zygote的共享分配.