C++:这看起来像内存碎片吗?

标签 c++ memory-management quadtree memory-fragmentation

总结:

我有一个应用程序消耗了更多的内存(大约是预期数量的 250%),但我似乎找不到任何内存泄漏。调用相同的函数(进行大量分配)将不断增加内存使用量到某个点,然后它不会改变并留在那里。

项目详情:

该应用程序使用四叉树数据结构来存储“点”。可以指定要存储在内存中的最大点数(缓存大小)。 “Points”存储在“PointBuckets”(链接到四叉树的叶节点的点数组)中,如果达到四叉树中的最大点总数,则将其序列化并保存到临时文件中,以便在需要。这一切似乎工作正常。

现在,当加载一个文件时,会创建一个新的四叉树,如果旧的四叉树存在,则将其删除,然后从文件中读取点并一个一个地插入到四叉树中。在节点 split 等过程中创建和删除存储桶时会发生大量内存分配。

症状:

如果我加载一次预期使用 300MB 内存的文件,我将获得预期的内存消耗量。都好。如果我一遍又一遍地加载同一个文件,内存使用量会不断增长(我正在查看 Linux 顶部的 RES 列),直到大约 700MB。这可能表明存在内存泄漏。但是,如果我继续加载文件,内存消耗将保持在 700MB。

另一件事:当我使用 valgrind massif 并查看内存使用情况时,它始终保持在预期限制内。例如,如果我指定缓存大小为 1.5 GB 并单独运行我的程序,它最终会消耗 4GB 内存。如果我在 massif 中运行它,它将一直保持在 2GB 以下,然后在生成的图表中我将能够看到它实际上从未分配超过预期的 1.5GB。我天真的假设是,发生这种情况是因为 massif 使用自定义内存池,以某种方式防止碎片化。

那么你认为这里发生了什么?如果是内存碎片,我应该寻找什么样的解决方案来解决这个问题?

最佳答案

我会把它更多地放在简单的分配器和操作系统缓存行为上。它们保留您分配的内存而不是释放它,以便在您下次请求时可以更迅速地返回给您。但是,对于这种效果,250% 听起来确实很多 - 您可能正在研究碎片化问题。

尝试将您的分配器换成无碎片的分配器,例如对象池或内存区域。

关于C++:这看起来像内存碎片吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11437942/

相关文章:

即使我正在释放,iPhone 应用程序也会由于收到内存警告而崩溃

c - C 中的内存分配跟踪——我这样做对吗?

c++ - 将 Qt 与 DirectX 一起使用?

c++ - 优化 Alpha 混合

c++ - Win32 - 从标准输入读取超时

javascript - 使用任意 x 和 y 名称初始化 d3 四叉树

2d - 无限无标度四叉树叫什么?

c++ - 从另一个容器创建容器,在 C++ 中应用每个元素一些函数

java - Jboss(Java) 进程对驻留内存使用量的逐渐增加

java - 将高度图分成象限