6

我在 PID 上使用 showmap 命令,我无法理解报告中的这一部分:

 16384     3752      689        0     3132        0      620    4 /dev/ashmem/dalvik-LinearAlloc (deleted)
  2460     1748      934        0      828        0      920   18 /dev/ashmem/dalvik-aux-structure (deleted)
  8192      572      572        0        0        0      572    1 /dev/ashmem/dalvik-bitmap-1 (deleted)
  8192        0        0        0        0        0        0    1 /dev/ashmem/dalvik-bitmap-2 (deleted)
  4100      312      312        0        0        0      312    1 /dev/ashmem/dalvik-card-table (deleted)
502140    14860    14860        0        0        0    14860    3 /dev/ashmem/dalvik-heap (deleted)
  1500      280      280        0        0        0      280    1 /dev/ashmem/dalvik-jit-code-cache (deleted)
174764        0        0        0        0        0        0    1 /dev/ashmem/dalvik-mark-stack (deleted)
 22148    22148     2141        0    20452        0     1696    1 /dev/ashmem/dalvik-zygote (deleted)

我想知道 dalvik-LinearAlloc、dalvik-aux-structure、dalvik-bitmap-1、dalvik-bitmap-2、dalvik-card-table、dalvik-mark-stack 和 dalvik-zygote 中有哪些数据。

这些 ashmem 占用了数百万字节的内存,我想找到一种方法来缩小这些 ashmem 的大小。

4

1 回答 1

10

showmap正在从一个进程中转储 smap 数据。smap描述了进程的内存区域的细节。在虚拟内存管理系统中,内存可以通过mmapbrk等系统 API 获取。通过这些 API 获取虚拟内存地址后,地址长度会记录在smap中。

让我们列出 dalvik 相对内存使用的每个部分:

  • Dalvik 堆部分(堆管理,GC)
    • dalvik-bitmap-1, dalvik-bitmap-2 是 Dalvik Heap管理数据结构。在 Dalvik 中,GC 是Marksweep,并且 8 字节内存将被标记(使用或空闲)为位图中的一位。这两个位图将用作活动图(用于标记@runtime),另一个将用作标记图(用于@GC 时间)。
    • dalvik-mark-stack:供 GC 标记步骤使用。标记步骤将迭代位图,因此这是一个需要堆栈的广度优先搜索。
    • dalvik-card-table:用于Dalvik Concurrent GC,在位图标记步骤中,该进程将执行其他会导致使用内存的任务。这些卡表在第一个标记步骤后记录内存脏。您可以通过搜索标记扫描GC查看详细信息。
    • dalvik-heap 用于进程内存使用
    • dalvik-zygote 是hole heap 的一部分,@GC 不会用到。所有进程将共享这些内存,例如框架资源。
  • dalvik-jit 是 Dalvik 中使用的jit内存。JIT:及时,它将dex字节码转换为CPU可以执行的机器码。
  • dalvik-LinearAlloc:是dalvik的永久内存如:方法、类定义数据、线程栈数据。这些内存可以在解析类定义后设置为只读。
  • dalvik-aux-structure:辅助数据结构,它将压缩方法/类/字符串常量引用。这些引用将在每个 dex 文件中使用,但是这些内存的总和会占用很大的内存。所以 Dalvik 创建了一个 tmp 内存来共享这些引用。

如果你想分析你程序的内存,我建议你在eclipse中使用MAT。而原生堆的使用,可以使用mmap来管理。

于 2014-03-10T14:27:17.333 回答