2016-12-02 3 views
-2

TotalAddrSpace(THeapStatus)がクラッシュする2GBレベルに達したため、My Delphi6プログラムがクラッシュします。私は($ SetPEFlags $ 20を使って)4GBレベルの制限を増やすことができましたが、それは最終的なクラッシュを遅らせるだけです。TotalUncommittedメモリが増加し続けるため、My Delphi6プログラムがクラッシュする

TotalUncommittedメモリが何らかの理由で増加し続けているのに対して、TotalCommittedメモリとTotalAllocatedメモリも許容レベル(約550 MB)で安定しているという問題があります。

TotalUncommittedメモリが増加し続け、最終的にTotalAddrSpaceが2GB(現在は4GB)レベルに達し、プログラムがクラッシュする理由はわかりません。私は長さIが増加またはは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

ありがとうございました!

私の問題は、ヒープフラグメンテーション(またはそれの理解)の1つであることが判明しました。

私はSetlengthを使用して、必要に応じてダイナミックアレイを常に5段階ずつ増減させました。各配列要素のサイズを考えると、これは明らかに実際に必要なメモリよりも多くのメモリを確保するため、Heap.TotalUncommitedはHeapと同様に境界なしに大きくなりました。 TotalAddrSpace。

影響を確認するために異なるステップサイズを試しました。少し大きめのステップサイズで問題はなくなりました。

関連する問題