Memory management 在分配小型(<;500Kb)数据块时,realloc在一段时间后返回NULL;内存不足

Memory management 在分配小型(<;500Kb)数据块时,realloc在一段时间后返回NULL;内存不足,memory-management,realloc,out-of-memory,Memory Management,Realloc,Out Of Memory,你好 简短的问题是:问题出在哪里 我的程序(由任务管理器显示)在运行的所有时间(近40分钟)内的总体内存使用量几乎相同,而且我还有近2G的可用内存 在win2003r2上运行 内存分配/释放足够高-我需要与其他软件交互,为它准备数据,并在它过时时将其删除。数据块的数量不是恒定的 谢谢通常只有两个原因导致realloc失败 没有足够的连续内存来满足请求 内存损坏 即使程序中有足够的总内存来满足请求,但由于碎片,可能没有足够的连续内存来满足请求。确定这一点的最佳方法是使用能够报告连续块的工具,以确定

你好

简短的问题是:问题出在哪里

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

在win2003r2上运行

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


谢谢

通常只有两个原因导致realloc失败

  • 没有足够的连续内存来满足请求
  • 内存损坏

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

    通常只有两个原因导致realloc失败

  • 没有足够的连续内存来满足请求
  • 内存损坏

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

    由于没有代码可供查看,我只能给您一个变通方法

    尝试
    realloc
    ing仅在需要内存增长时使用内存,并将其大小增加一倍,而不只是添加所需的字节数。这对碎片化非常有帮助。既然你说你有足够的内存,那么当你完成的时候不要担心释放它,只要在合理的情况下保持它就行了


    以不惜任何代价减少碎片为目标,保持一个200mb的工作集对于我今天的计算能力来说似乎非常好。如果您经常超过500mb,并且您的程序运行了很长一段时间,您可以开始进一步优化工作集,但在此之前不要担心它。

    没有代码可看,我只能给您一个变通方法

    尝试
    realloc
    ing仅在需要内存增长时使用内存,并将其大小增加一倍,而不只是添加所需的字节数。这对碎片化非常有帮助。既然你说你有足够的内存,那么当你完成的时候不要担心释放它,只要在合理的情况下保持它就行了


    以不惜任何代价减少碎片为目标,保持一个200mb的工作集对于我今天的计算能力来说似乎非常好。如果您经常超过500mb,并且您的程序运行了很长一段时间,您可以开始进一步优化工作集,但在此之前不要担心它。

    任务管理器中此程序的VM大小是多少?是32位还是64位?32位,虚拟机大小几乎相同,比Mem usage多10%左右任务管理器中此程序的虚拟机大小是多少?是32位还是64位?32位,虚拟机大小几乎相同,比Mem UsageThank您的答案高出近10%!我考虑过内存碎片,但不确定是否可能。有什么方法可以避免吗?还有另一个问题:你能告诉我内存损坏发生时的情况吗?简单的、有故障的硬件:实际的ram、过热的cpu、处理ram和cpu之间传输的主板电路故障,甚至电源也可能发生故障并在很短的时间内关闭部分计算机。我特别提到了最后一个,这里不是关于硬件内存损坏,我想:)而是关于写入非自有内存。还是不?谢谢你的回答!我考虑过内存碎片,但不确定是否可能。有什么方法可以避免吗?还有另一个问题:你能告诉我内存损坏发生时的情况吗?简单的、有故障的硬件:实际的ram、过热的cpu、处理ram和cpu之间传输的主板电路故障,甚至电源也可能发生故障并在很短的时间内关闭部分计算机。我特别提到了最后一个,这里不是关于硬件内存损坏,我想:)而是关于写入非自有内存。还是不?我试试看。谢谢你的回答!我试试看。谢谢你的回答!