【问题标题】:My Delphi6 program crashes because the TotalUncommitted memory keeps increasing我的 Delphi 6 程序崩溃,因为总提交的内存不断增加
【发布时间】:2016-12-02 11:49:22
【问题描述】:

我的 Delphi6 程序崩溃了,因为 TotalAddrSpace (THeapStatus) 在某个时候达到了 2GB 级别,然后它就崩溃了。我已经能够将限制提高到 4GB 级别(使用 {$SetPEFlags $20}),但这只会延迟最终的崩溃。

问题是 TotalUncommitted 内存由于某种原因不断增加,而 TotalCommitted 内存和 TotalAllocated 内存很好地稳定在可接受的水平(大约 550 MB)。

我无法完全弄清楚为什么 TotalUncommitted 内存不断增加并最终使 TotalAddrSpace 达到 2GB(现在:4GB)级别并且程序崩溃。

在程序中,我使用了许多动态数组,我通过SetLength 命令进行简单的调整,定期增加或减少其长度。以这种方式定期增加/减少动态数组是否会有效地导致 TotalUncommitted 内存的增加超出界限?

非常感谢任何建议或见解。

另外,如果您知道一种以某种方式主动减少 TotalUncommitted 内存的通用机制...

【问题讨论】:

  • 也许你受到heap fragmentation的约束?
  • 发生这种情况的原因有很多。我们尝试将它们全部列出是不现实的。可能这个问题不合适 - 太宽泛了。

标签: delphi memory dynamic-arrays


【解决方案1】:

感谢大家的帮助!!

我的问题原来是堆碎片(或我对它的理解)之一。

我使用 Setlength 根据需要增加/减少动态数组,始终以 5 个位置为步长。考虑到每个数组元素的大小,这显然会导致操作系统保留比实际需要更多的内存,这使得 Heap.TotalUncommited 和 Heap 一样无限增长。总地址空间。

我尝试了不同的步长来查看影响。随着步长的增大,问题就消失了。

【讨论】:

    【解决方案2】:

    我强烈建议您运行包含MemCheck 的特殊版本。它是检测应用程序内存泄漏的绝佳工具。更现代的 Delphi 版本内置了一些此类功能(部分归功于 FastMem),但自第一个 Delphi 版本以来就已经存在,并且在版本 5、6、7 上运行良好。

    【讨论】:

    • 同意,但我没怎么用过 FastMM。 (我的坏)
    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2013-04-18
    • 2014-06-14
    相关资源
    最近更新 更多