我的Delphi6程序崩溃,因为未提交的总内存不断增加

我的Delphi6程序崩溃,因为未提交的总内存不断增加,delphi,memory,dynamic-arrays,Delphi,Memory,Dynamic Arrays,我的Delphi6程序崩溃是因为TotalAddrSpace THeapStatus在某个点达到2GB级别,然后崩溃。我已经能够使用{$SetPEFlags$20}增加4GB级别的限制,但这只会延迟最终的崩溃 问题是,由于某种原因,TotalUncommitted内存一直在增加,而TotalCommitted内存和TotalAllocated内存则稳定在大约550MB的可接受水平 我不太明白为什么TotalUncommitted内存不断增加,最终使TotalAddrSpace达到2GB:4GB级

我的Delphi6程序崩溃是因为TotalAddrSpace THeapStatus在某个点达到2GB级别,然后崩溃。我已经能够使用{$SetPEFlags$20}增加4GB级别的限制,但这只会延迟最终的崩溃

问题是,由于某种原因,TotalUncommitted内存一直在增加,而TotalCommitted内存和TotalAllocated内存则稳定在大约550MB的可接受水平

我不太明白为什么TotalUncommitted内存不断增加,最终使TotalAddrSpace达到2GB:4GB级别,程序崩溃

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

非常感谢您的任何建议或见解


另外,如果您知道一种通用机制,可以以某种方式主动减少未提交的内存总量…

我强烈建议您运行一个包含的特殊构建。它是检测应用程序内存泄漏的一个非常好的工具。更现代的Delphi版本有一些内置的功能,这部分要归功于FastMem,但这一功能自第一个Delphi版本以来就已经存在,并且在版本5、6、7上工作得非常好。

谢谢大家的帮助

我的问题是堆碎片或我对它的理解

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


我尝试了不同的步长来观察效果。步幅稍大,问题就消失了。

也许你会受到影响?可能会发生这种情况的原因很多。对我们来说,把它们全部列出是不现实的。可能这个问题不合适-太宽了。同意,但我没有太多使用FastMM。我的错