在Linux(* nix)的C程序中,我最小化内存占用的select是什么?
据我所知libc malloc()正在使用brk()或mmap()。 使用brk()分配的内存通常由于内存碎片而无法返回。
我的程序应该24/7全天候工作,并且它有很多的malloc()和s()。 开始后,RSS上升到大约100Mb。 这太多了,因为我知道在任何特定的时刻内存中的数据less于100MB。
可能是brk()碎片问题。
那么,我的select是什么呢?
我应该使用另一个malloc()实现,它只使用mmap()? 我应该做点什么吗? 有什么我可以阅读关于内存占用问题?
谢谢。
如果你的程序有这么多的malloc
和free
电话,你会得到这种碎片,每个分配使用mmap
将是无望的缓慢。 相反,你需要测量是什么导致内存碎片并修复它。 首先,我会使用像valgrind这样的工具来确保它实际上不是内存泄漏/损坏问题,导致内存使用率过高。 然后,为了确认问题的原因是碎片,我将把所有的调用都包装到malloc
并且用自己的包装来free
,这个包装会增加和减少“总分配字节数”变量,所以你可以在任何时候将理论和实际的内存消耗。
如果事实证明,碎片化是个问题,那么首先要考虑的是,为什么要做出如此之多的小而短暂的分配。 如果你可以消除它们,而是分配一个特定的任务/数据对象在一个块中需要的所有内存,然后自行切割,你不但可以摆脱最糟糕的碎片,而且还可以提高代码的性能一点点。 每次调用malloc
或free
带来很多开销,特别是在需要同步/锁定的线程环境中。 将所有关联的数据保存在一个单独的分配块中也可以减少或消除编写特殊代码以释放包含指针的结构的需要; 一个free
调用通常就足够了(尽管为了保持实现不透明,你仍然应该用foo_free
函数来包装它)。
除非您正在分配固定大小的块 – 或者执行某种类型的定期垃圾回收 – 否则内存占用空间可能会超出碎片所需的范围。
除非完整页面未被使用,否则free()
不能将内存返回到操作系统。
我的建议是使用平板分配方案。 预分配多个内存池。 每个游泳池都将使用相似尺寸的物体(理想尺寸相同)。 这样你就可以避免碎片化,并保持你的RSS足迹不变(尽管由于预先分配而比绝对必要的更大)。