最近用 C 开发一个服务器软件,代码需要频繁的分配内存,并且用到的第三方库 GLIB 和 libCurl 也有不同的内存分配方式。
在开发过程中,发现一个问题,就是在压力测试下,程序耗用内存一直增长,直到用完 3G 的虚存空间,从而 malloc 失败;而我的代码中,内存使用完后都是及时释放的,不应该出现这种现象。
因此首先怀疑是有内存泄露,但是无论用 valgrind,还是 dmalloc,都无法检测到有内存泄露的问题。
苦恼......
无奈之下,怀疑是不是有堆碎片。所谓“堆碎片”,就是在堆中分配了大量内存,这些内存使用完并释放,但是在“堆”的最上面那部分,有一小部分内存没有释放,结果导致整个“堆”空间显得很大。关于“堆碎片”,没有查到有价值的资料。
后来读到 “飞翔”(博客 http://www.cublog.cn/u/30686/index.html )总结的一篇关于 Linux 内存的文档 http://blogimg.chinaunix.net/blog/upfile2/080304080036.pdf,对“内存空洞”做了比较详细的解释。
以下代码是对“内存空洞”或者更精确的说“堆碎片”的验证:(运行起来后,给此进程多次发送 USR1 信号,每次发送完信号后,cat /proc/[pid]/maps 来观察堆的变化)





