【发布时间】:2020-09-25 02:25:59
【问题描述】:
我有一个过程,我试图说明所有内存的去向。我的第一个想法是使用 gdb 遍历所有 arenas 并像这样输出它们的系统内存(我已将进程配置为 32 个 arenas):
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 "%d\n", $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 ]
块 42 从 7fc18... -> 7fc18d 跃入地址空间。同时,我们在 07fc1840c8000 之后继续处理这些 pmapped 地址,这些地址似乎没有被现有块考虑。
我在 RHEL7 下使用 glibc 2.17。我错过了什么吗???我怎样才能拥有系统默认 malloc 实现似乎没有考虑的内存区域?或者也许我在某个地方严重误解了某些东西。我的内存统计怎么这么少?
提前致谢!!
【问题讨论】:
标签: linux gdb malloc redhat glibc