glibc Arena system_mem 加起来不等于 VSS 或 RSS 的数量



我有一个过程,我试图解释所有内存的去向。 我的第一个想法是使用 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 来跟踪。

相关内容

  • 没有找到相关文章

最新更新