gpt4 book ai didi

c - 最小化 C 程序中的内存占用

转载 作者:IT王子 更新时间:2023-10-28 23:34:06 24 4
gpt4 key购买 nike

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

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

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

可能是 brk() 碎片问题。

那么,我在这里有什么选择?

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

谢谢。

最佳答案

如果你的程序有这么多的 mallocfree 调用,你会得到这种碎片,那么对每个分配使用 mmap 将是无可救药的减缓。相反,您需要测量导致内存碎片的原因并修复它。首先,我会使用像 valgrind 这样的工具来确保它实际上不是导致内存使用过多的内存泄漏/损坏问题。然后,为了确认问题的原因是碎片,我将使用您自己的包装器包装对 mallocfree 的所有调用,该包装器增加和减少“总分配字节数” "变量,因此您可以随时比较理论和实际内存消耗。

如果事实证明碎片是问题所在,那么第一步就是了解为什么要进行如此多的小而短暂的分配。如果您可以消除它们,而是在一个 block 中分配特定任务/数据对象所需的所有内存,然后自己将其切碎,您不仅可以摆脱最糟糕的碎片,还可以大大提高代码的性能一点点。对 mallocfree 的每次调用都会产生大量开销,尤其是在需要同步/锁定的线程环境中。将所有相关数据放在一个分配的 block 中还可以减少或消除编写特殊代码来释放包含指针的结构的需要;对 free 的一次调用通常就足够了(尽管为了保持实现不透明,您仍然应该使用 foo_free 函数来包装它)。

关于c - 最小化 C 程序中的内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4292368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com