“堆碎片”以及解决方法

本文描述了作者在开发C语言服务器软件时遇到的内存问题,尤其是在压力测试下,内存持续增长,疑似堆碎片导致。通过检查和使用内存泄漏检测工具未找到问题。在阅读相关文档后,确认了堆碎片的存在,并通过发送信号和观察/proc/pid/maps来验证。最终,通过调整GLIBC的M_MMAP_THRESHOLD参数,降低了malloc使用mmap2的阈值,有效解决了堆碎片问题,使内存使用保持在较低水平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

最近用 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 来观察堆的变化)

 

#include  < stdlib.h >
#include 
< stdio.h >
#include 
< string .h >
#include 
< unistd.h >
#include 
< signal.h >
#include 
< malloc.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值