我有一个过程,我试图解释所有内存的去向。 我的第一个想法是使用 gdb 遍历所有竞技场并像这样输出它们的系统内存(我已将该过程配置为 32 个竞技场(:
define arenaSizeWalk
set var $n = main_arena
set var $size = 0
set var $count = 0
while $count < 32
set var $size = $n.system_mem
set var $n = $n.next
set var $count = $count + 1
printf "%dn", $size
end
end
但是,这很短。 这加起来为 ~3GB。 但是我从 pmap 收集的总内存占用量(不包括堆栈保护和加载的库(为 25GB。
此外,我使用 gdb-heap 转储所有内存块,并将它们与 pmap 的输出进行比较
From heap all:
...
39: 0x00007fc1840c8000 -> 0x00007fc1841c8fff inuse: 1052672 bytes (<MChunkPtr chunk=0x7fc1840c8000 mem=0x7fc1840c8010 prev_size=0 IS_MMAPPED chunksize=1052672 memsize=1052656>)
40: 0x00007fc1841c9000 -> 0x00007fc184649fff inuse: 4722688 bytes (<MChunkPtr chunk=0x7fc1841c9000 mem=0x7fc1841c9010 prev_size=0 IS_MMAPPED chunksize=4722688 memsize=4722672>)
41: 0x00007fc18464a000 -> 0x00007fc18474afff inuse: 1052672 bytes (<MChunkPtr chunk=0x7fc18464a000 mem=0x7fc18464a010 prev_size=0 IS_MMAPPED chunksize=1052672 memsize=1052656>)
42: 0x00007fc1d401b000 -> 0x00007fc1d4044fff inuse: 172032 bytes (<MChunkPtr chunk=0x7fc1d401b000 mem=0x7fc1d401b010 prev_size=0 IS_MMAPPED chunksize=172032 memsize=172016>)
...
From pmap:
00007fc1840c8000 6668K rw--- [ anon ]
00007fc18474c000 1024K rw--- [ anon ]
00007fc18484d000 1024K rw--- [ anon ]
00007fc18494e000 1024K rw--- [ anon ]
00007fc184a4f000 1024K rw--- [ anon ]
00007fc184b50000 1024K rw--- [ anon ]
00007fc184c51000 1024K rw--- [ anon ]
00007fc184d52000 1024K rw--- [ anon ]
00007fc184e53000 1024K rw--- [ anon ]
00007fc184f54000 1024K rw--- [ anon ]
Chunk 42 的地址空间从 7fc18... -> 7fc18d 跃升。 同时,我们在 07fc1840c8000 之后处理这些映射地址,这些地址似乎没有被现有块考虑在内。
我在 RHEL7 下使用 glibc 2.17。 我错过了什么吗??? 如何拥有系统默认 malloc 实现似乎没有考虑的内存区域? 或者也许我在某处严重误解了某些东西。 我怎么在内存会计上这么缺?
提前感谢!!
我想通了。 内存区域无法以这种方式跟踪的原因是程序的其他一些部分直接调用 mmap((,而不是使用 malloc(( 或 new。
只有那些与 malloc 接口的分配才能通过检查main_arena或使用 gdb-heap 来跟踪。