Advertisement

内存碎片和内存空洞

阅读量:

内存碎片/内存空洞

内存碎片: 在程序长时间运行过程中(即经过漫长的运行时段),因为频繁地调用了malloc和free函数。即便没有明显的记忆泄漏现象,在这段时间内使用的总记忆不断累积。偶尔可能会出现mall函数无法成功分配所需记忆的情况。

内存释放的原因在于,在Linux系统中使用malloc系列函数申请内存时,默认情况下不支持大段内存分配(non-m mmap)。当这些非 mmap 申请的内存块被释放时,在Linux内核的设计下,默认情况下只有堆头(heap head)区域能够真正融合成一个大的连续空间供后续应用使用)。对于处于中间位置的那些尚未完全释放到堆中的内存块(即使通过free命令暂时回收),仍然由当前进程所独占而无法直接供其他进程使用)。只有当这些处于堆头位置的内存块也完成释放后,“片断”的空闲空间才能真正形成一块完整的可用空间供其他进程使用。

解决方案:
此问题没有最终的完美的解决方案。

  1. 尽可能多采用内存空间的复用,减少频繁申请大量小的内存块的操作。

  2. 为程序所需动态内存制定统一规划方案。
    将那些需要长时间占用内存的操作提前,在程序启动后的初始化阶段执行,
    而那些不需要长时间占用内存的操作则安排在后续阶段处理。
    这样做的好处是可以及时释放堆顶区域。
    需要注意的是,
    后来申请的位置不一定比原来的更大,
    可能用了之前释放

全部评论 (0)

还没有任何评论哟~