【问题标题】:realloc returns NULL after some time while allocating small (<500Kb) data block; there is enoug memoryrealloc 在分配小(<500Kb)数据块时返回 NULL;有足够的内存
【发布时间】:2010-04-26 16:44:33
【问题描述】:

嗨!

简短的问题是:可能是什么问题?

我的程序的整体内存使用量(由任务管理器显示)在它运行的所有时间(近 40 分钟)几乎相同,并且我有近 2G 的可用内存。

在win2003r2上运行。

内存分配/释放足够高 - 我需要与其他软件交互,为它准备数据并在它过时时删除它。数据块数不固定。

谢谢!

【问题讨论】:

  • 任务管理器中这个程序的虚拟机大小是多少?是32位还是64位?
  • 32bit,VM大小差不多,比Mem Usage多了近10%

标签: memory-management realloc out-of-memory


【解决方案1】:

通常只有两个原因 realloc 会失败

  1. 没有足够的连续内存来满足请求
  2. 内存损坏

即使您的程序中有足够的总内存来满足请求,但由于碎片,可能没有足够的连续内存来满足请求。确定这一点的最佳方法是使用可以报告连续块的工具来确定是否有一个可以满足您的请求。我相信 sysinternals 包中的工具之一就是这样做的。

【讨论】:

  • 感谢您的回答!我考虑过内存碎片,但不确定是否可能。有什么方法可以避免吗?还有一个问题:当内存损坏发生时,你能告诉我任何场景吗?
  • 简单的硬件故障:实际的内存、cpu 过热、处理内存和 cpu 之间传输的故障主板电路,甚至电源都可能发生故障并在很短的时间内关闭计算机的某些部分时间。我特别喜欢最后一个。
  • 这里不是关于硬件内存损坏,我认为 :) 而是关于写入不拥有的内存。还是不行?
【解决方案2】:

没有代码可看,我只能给你一个解决方法。

仅在需要增加内存时尝试reallocing 内存,并将其大小增加一倍,而不是仅仅添加所需的字节数。这对碎片化有很大帮助。既然你说你有足够的内存,那就不用担心完成后释放它,只要它足够合理就保留它。

将不惜一切代价减少碎片化作为您的目标,就当今的计算能力而言,保持 200mb 的工作集对我来说似乎完全没问题。如果您经常超过 500mb 并且您的程序运行了很长时间,您可以开始考虑进一步优化工作集,但在此之前不要担心。

【讨论】:

  • 我会试试的。谢谢你的回答!
猜你喜欢
  • 2012-09-21
  • 2016-02-28
  • 2012-12-06
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多