您可以尝试的另一个工具是/lib/libmemusage.so
图书馆:
$ LD_PRELOAD=/lib/libmemusage.so vim
Memory usage summary: heap total: 4643025, heap peak: 997580, stack peak: 26160
total calls total memory failed calls
malloc| 42346 4528378 0
realloc| 52 7988 0 (nomove:26, dec:0, free:0)
calloc| 34 106659 0
free| 28622 3720100
Histogram for block sizes:
0-15 14226 33% ==================================================
16-31 8618 20% ==============================
32-47 1433 3% =====
48-63 4174 9% ==============
64-79 4736 11% ================
80-95 313 <1% =
...
(I quit vim
启动后立即。)
也许块大小的直方图将为您提供足够的信息来告诉您哪里可能发生泄漏。
valgrind
非常可配置;--leak-check=full --show-reachable=yes
如果您还没有尝试过,这可能是一个很好的起点。
“虚拟内存”、“常驻内存”、“可写内存”和“内存”
虚拟内存是您的应用程序拥有的地址空间已分配。如果你跑malloc(1024*1024*100);
, the malloc(3)
库函数将从操作系统请求 100 MB 的存储空间(或从空闲列表中处理它)。这 100 兆字节将分配为mmap(..., MAP_ANONYMOUS)
, 它实际上不会分配任何内存。 (见文末吐槽malloc(3)
页了解详细信息。)操作系统将在第一次写入每个页面时提供内存。
虚拟内存负责映射到进程中的所有库和可执行对象以及堆栈空间。
驻留记忆是实际的内存量in RAM。您可以链接整个 1.5 MB C 库,但仅使用支持标准 IO 接口所需的 100k(大胆猜测)库。图书馆的其余部分将按需寻呼 http://en.wikipedia.org/wiki/Demand_paging需要时从磁盘中导入。或者,如果您的系统面临内存压力,并且一些最近较少使用的数据被调出以进行交换,则它将不再计入驻留记忆.
可写内存是您的进程分配有写权限的地址空间量。 (检查输出pmap(1)
命令:pmap $$
例如,对于 shell,查看哪些页面映射到哪些文件、匿名空间、堆栈以及这些页面上的权限。)这是程序有多少交换空间的合理指示might在最坏的交换场景中需要,此时所有内容都必须分页到磁盘,或者进程使用了多少内存为自己.
因为您的系统上可能同时有 50--100 个进程,并且几乎所有进程都与标准 C 库链接,所以所有进程都会访问share库的只读内存映射。 (他们还可以共享所有写时复制私有可写使用以下命令打开的任何文件的映射mmap(..., MAP_PRIVATE|PROT_WRITE)
,直到进程写入内存。)top(1)
工具将报告内存量can在进程之间共享SHR
柱子。 (请注意,内存可能not被共享,但其中一些(libc
)绝对是共享的。)
Memory很模糊。我不知道这意味着什么。