C++:这看起来像内存碎片吗
C++: Does this look like memory fragmentation?
摘要:
我有一个应用程序消耗的内存远远超过了它应该消耗的内存(大约是预期量的250%),但我似乎找不到任何内存泄漏。调用同一个函数(进行大量分配)将在一定程度上不断增加内存使用量,然后它就不会改变并保持不变。
程序详细信息:
应用程序使用四叉树数据结构来存储"点"。可以指定要存储在内存中的最大点数(缓存大小)。"Points"存储在"PointBuckets"(链接到四叉树叶节点的点阵列)中,如果达到四叉树中的最大点总数,这些点将被序列化并保存到临时文件中,以便在需要时检索。这一切似乎都很好。
现在,当加载一个文件时,会创建一个新的四叉树,如果存在旧的,则会删除它,然后从文件中读取点,并逐个插入到四叉树中。在节点拆分等过程中,当创建和删除存储桶时,会进行大量内存分配。
症状:
如果我加载一个预期使用300MB内存的文件一次,我就会得到预期的内存消耗量。一切都很好。如果我一次又一次地加载同一个文件,内存使用量就会不断增长(我看到的是顶部的RES列,Linux),直到大约700MB。这可能表明内存泄漏。然而,如果我继续加载文件,内存消耗将保持在700MB。
另一件事:当我使用valgrind massif并查看内存使用情况时,它总是保持在预期的范围内。例如,如果我将缓存大小指定为1.5GB并单独运行程序,它最终将消耗4GB的内存。如果我在massif中运行它,它将一直保持在2GB以下,然后在生成的图中,我可以看到它实际上从未分配超过预期的1.5GB。我天真的假设是,发生这种情况是因为massif使用了一个自定义内存池,以某种方式防止碎片。
那么你认为这里发生了什么?如果是内存碎片,我应该寻找什么样的解决方案来解决这个问题?
我更倾向于简单的分配器和操作系统缓存行为。它们会保留你分配的内存,而不是释放内存,以便下次你请求时可以更及时地将其返回给你。然而,250%听起来确实有很多这种效果-你可能会遇到碎片问题。
试着把分配器换成一个无碎片的分配器,比如对象池或内存竞技场。
- std::vector的包装器,使数组的结构看起来像结构的数组
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 尽管一切看起来都很好,但值不会交换
- 自制的上衣:看起来一样,但不完全相同
- 如何使它看起来像正在下的雪
- 在嵌入式系统中读取文件的内存碎片
- 如何用逗号分隔输出?如何改进此代码以使其看起来更体面?
- 我的代码看起来不错,但某些输入会导致不需要的输出
- 为什么这个结构的大小是 40,而它看起来应该是 12/24?
- 我需要将阵列样式的邻接矩阵转换为矢量样式(以使其看起来更好)
- 内存碎片会减慢新/malloc
- 结构化绑定:当某些内容看起来像引用并且行为类似于引用,但它不是引用时
- 最终的ARM Linux内存碎片与NEON Copy,但不是memcpy
- 如何使QTextEdit看起来被禁用
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 内存碎片是否导致内存异常
- 看起来如此主要的错误.cpp:(.text.startup+0xd6):未定义对"vtable for Counter"的引用?
- C++:这看起来像内存碎片吗
- 为什么GDB中的一些内存地址看起来比其他的短