2016-12-02 104 views
-2

我的Delphi6程序崩潰,因爲TotalAddrSpace(THeapStatus)在某個點達到2GB級別,並且崩潰。我已經能夠增加4GB級別的限制(使用{$ SetPEFlags $ 20}),但這隻會延遲最終的崩潰。我的Delphi6程序崩潰,因爲TotalUncommitted內存不斷增加

的問題是,所述TotalUncommitted存儲器保持某種原因增加,而TotalCommitted存儲器以及還有TotalAllocated存儲器很好地在可接受的水平(大約550 MB)穩定。

我不明白爲什麼TotalUncommitted內存不斷增加,並最終使TotalAddrSpace達到2GB(現在:4GB)級別和程序崩潰。

在程序我使用許多動態數組,其長度我增加或經由SetLength命令簡單的調整經常降低。這種以這種方式定期增加/減少動態數組是否會有效地導致TotalUncommitted內存的增加超出界限?

非常感謝您的任何建議或見解。

另外,如果你知道一個通​​用的機制以某種方式積極降低TotalUncommitted內存...

+1

也許你受[堆碎片](http://stackoverflow.com/a/2569754/800214)? – whosrdaddy

+2

這可能發生的原因很多。我們嘗試列出所有這些並不現實。可能這個問題是不合適的 - 太寬泛。 –

回答

-1

我最強烈建議您運行已MemCheck包括一個特殊的版本。這是檢測應用程序中內存泄漏的非常好的工具。更現代的Delphi版本有一些內置的功能(部分歸功於FastMem),但是自從第一個Delphi版本以來,這個版本已經出現並且在版本5,6,7上運行良好。

+1

[FastMM4](https://github.com/pleriche/FastMM4)支持D4的Delphi版本。 –

+0

同意,但我沒有使用FastMM多。 (我的錯) –

0

感謝您的幫助!

我的問題原來是堆碎片(或我的理解)之一。

我使用Setlength來根據需要增加/減少一個動態數組,總是在5個位置的步驟。考慮到每個數組元素的大小,這顯然會導致操作系統保留比實際需要的更多的內存,這使得Heap.TotalUncommited像Heap一樣無限制地增長。 TotalAddrSpace。

我嘗試了不同的步長來查看影響。隨着步長的增大,問題消失了。