最大限度地减少C程序中的内存占用

Mar*_*vac 9 c unix linux memory memory-management

在Linux(*nix)上最小化C程序中的内存占用有哪些选择?

据我所知libc malloc()正在使用brk()或mmap().由于内存碎片,通常无法返回使用brk()分配的内存.

我的程序应该全天候工作,它会执行很多malloc() - s和free() - s.启动后,RSS上升到大约100Mb.这太过分了,因为我确信在任何特定时刻内存中的数据都少于100 Mb.

可能是brk()碎片问题.

那么,我的选择在哪里?

我应该使用另一个仅使用mmap()的malloc()实现吗?我应该做别的吗?关于内存占用问题,我能阅读一些内容吗?

谢谢.

R..*_*R.. 11

如果你的程序有这么多malloc并且free调用你得到这种碎片,那么使用mmap每个分配将是无可救药的缓慢.相反,你需要衡量导致内存碎片的原因并修复它.首先,我将使用像valgrind这样的工具来确保它实际上不是内存泄漏/损坏问题导致过多的内存使用.然后,以确认该问题的原因是碎片化的,我想包所有来电malloc,并free用自己的包装,递增和递减一个"分配的总字节数"变量,所以你可以在任何一点上,比较理论和实际内存消费.

如果事实证明碎片化是一个问题,那么迈出良好的第一步就是看看为什么要进行如此多的小型短期分配.如果你可以消除它们,而是在一个块中分配一个特定的任务/数据对象所需的所有内存,然后自己砍掉它,你不仅可以摆脱最糟糕的碎片,而且还可以提高代码的性能.一点点.每次调用mallocfree产生大量开销,尤其是在需要同步/锁定的线程环境中.将所有相关数据保存在一个分配的块中也可以减少或消除编写特殊代码以释放包含指针的结构的需要; 一个电话free可能经常就足够了(虽然为了保持实现不透明,你仍然应该用foo_free函数包装它).

  • 基本上,如果你有很多相同的alloc,滚动你自己的freelist并预先分配大量的块.你可以在这里找到一个不错的无锁空闲列表; http://www.liblfds.org(兴趣减少:我是作者).我刚刚完成了freelist与基于互斥锁的freelist的基准测试; 它在一个核心上快了10倍,在两个核心上快了100倍! (2认同)