内存碎片和内存空洞
发布时间
阅读量:
阅读量
内存碎片/内存空洞
内存碎片: 在程序长时间运行过程中(即经过漫长的运行时段),因为频繁地调用了malloc和free函数。即便没有明显的记忆泄漏现象,在这段时间内使用的总记忆不断累积。偶尔可能会出现mall函数无法成功分配所需记忆的情况。
内存释放的原因在于,在Linux系统中使用malloc系列函数申请内存时,默认情况下不支持大段内存分配(non-m mmap)。当这些非 mmap 申请的内存块被释放时,在Linux内核的设计下,默认情况下只有堆头(heap head)区域能够真正融合成一个大的连续空间供后续应用使用)。对于处于中间位置的那些尚未完全释放到堆中的内存块(即使通过free命令暂时回收),仍然由当前进程所独占而无法直接供其他进程使用)。只有当这些处于堆头位置的内存块也完成释放后,“片断”的空闲空间才能真正形成一块完整的可用空间供其他进程使用。
解决方案:
此问题没有最终的完美的解决方案。
-
尽可能多采用内存空间的复用,减少频繁申请大量小的内存块的操作。
-
为程序所需动态内存制定统一规划方案。
将那些需要长时间占用内存的操作提前,在程序启动后的初始化阶段执行,
而那些不需要长时间占用内存的操作则安排在后续阶段处理。
这样做的好处是可以及时释放堆顶区域。
需要注意的是,
后来申请的位置不一定比原来的更大,
可能用了之前释放
全部评论 (0)
还没有任何评论哟~
