2

私たちは、24時間ノンストップで実行する必要のある数値計算シミュレーションであるアプリケーションをプログラムしました。Windowsフォームでのペイントイベントを使用して、被写体の視覚的表現を連続的にレンダリングします。さらに、プロジェクトオブジェクトの進行状況を示すために、いくつかのリアルタイムグラフとグリッドを使用しています。これは、.NETWindowsフォームアプリケーションです。

4時間後、システムoutOfMemory例外が発生します。

Memory Profilerは、リアルタイムグラフとその他の未処理のオブジェクトをトレードオフすると、「一部」(35%〜40%)のメモリを節約できることを示しています。

私の懸念は、それが24時間ノンストップで実行されないことです。32ビットWin7がインストールされたHP8440pElitebookInteli5にはすでに4GBのRAMが搭載されています。

私たちの目的は、シミュレーションアプリケーションとそれが実行されている.NETCLRに対して可能な限り最大のメモリを提供することです。より多くのメモリ(おそらく8GB)と64ビットOSに投資することは役に立ちますか?ハードウェアを追加する以外に、他にどのようなCLRオプションを検討する必要がありますか?

どうもありがとう。

4

2 に答える 2

1

アプリは64ビットOSで実行されていますか?32ビットCLRアプリの上限はかなり低くなっています(2GBの論理制限をはるかに下回っています)が、64ビットCLRアプリは問題なく非常に大量のメモリを使用できるはずです。64ビットアプリは、物理メモリがなくなるとディスクにページングします。そのため、CLRからOutOfMemoryエラーが発生するずっと前に、マシン全体が物理メモリを使い果たし、ディスクへのページングを開始します。

于 2012-10-08T22:39:46.687 に答える
1

@AdamHouldsworthの提案は非常に良いものです。メモリリークに直面している可能性があります(古いオブジェクトへの参照はまだ保持されており、Adamが提案したように、ライブイベントサブスクリプションによって非常に頻繁に保持されます。これにより、ガベージコレクションが防止されます)。

@mkimesの回答も非常に価値があります。実際、64ビットプロセスとして実行すると、アプリケーションでより多くのメモリを管理できるようになりますが、それでもいくつかの注意点があります(単一オブジェクトのサイズの2GBの制限など)。

アプリケーションのメモリが不足してはいけないと直感的に感じる場合は、作成されたオブジェクトのほとんどが短命であり、破棄されているはずであるため、メモリリークが発生している可能性があります。ただし、プロセスが大量のオブジェクトを構築している場合は、プロセスの終了後または計算の長いフェーズ中に存続する必要があります。特に、フルの間にそれを考慮すると、32ビットのメモリ制限の障壁にぶつかる可能性があります。ガベージコレクションサイクルでは、アプリケーションのメモリは一時的に現在割り当てられているサイズの2倍近くになり、実際の32ビットメモリサイズの制限は約1GBに保たれます。

32ビットアプリケーションが処理できるメモリサイズを3GBに増やすことができるWindows構成スイッチがありますが、私の経験では、これによりオペレーティングシステムが不安定になり(非常に頻繁なブルースクリーン)、このオプションを慎重に検討してください。

メモリリークが疑われる場合:

この記事は役立つかもしれません。Windgb(高度なデバッガー)を使用して、不要な古い参照を存続させている可能性のあるオブジェクトをトレースする方法を示します。

また、(希望しないでください)、CLRが「大きなオブジェクト」と見なすもの、つまりサイズが85,000バイトを超えるオブジェクトを繰り返し頻繁に割り当てることによって引き起こされる可能性がある、メモリの断片化という非常に厄介な問題の犠牲になる可能性があります。これが問題の詳細を記した記事です。基本的に、このようなオブジェクトは、破棄される別のヒープの下に割り当てられますが、残念ながら、圧縮されることはありません。これは、解放されたメモリブロックに割り当てられたブロックが散在し、ランタイムがメモリ要求を満たすための単一の連続したメモリブロックを検出できず、メモリ不足例外がトリガーされる可能性があることを意味します。この場合、大きなモノリシックオブジェクトを小さなオブジェクトに分割すると役立ちます。

最後に、 64ビット未満でも2GBを超えるサイズのオブジェクトはあり得ないため、コレクションや配列がこの制限に達していないことに注意する必要があります。

于 2012-10-09T16:58:32.460 に答える