8

複雑なマルチスレッド アプリケーションの内部で、おそらく週に 1 回、メモリ不足の例外が発生しています。アプリケーションは、ネットワーク カードのバッファ オーバーランを回避するために、読み取ったデータがキャッシュされる複数のソケットを介して大量のデータを送信または読み取ります。
メモリ例外を分析するための最良の戦略は何ですか? 通常の実行時、アプリは Process Explorer で最大 1.5 ギガバイトの「すべてのヒープの合計バイト数」のサイズで表示されます。
どちらかをポーリングしているスレッドを持つことは戦略でしょうか

GC.GetTotalMemory()

また

PrivateMemorySize64()

物事の分析を開始するタイミングを知るために 1 秒に 1 回?私はまだ商用プロファイラーを調べていませんが、実際の問題分析に関して間違った結果をもたらす可能性があるそれらのパフォーマンスへの影響について少し心配しています.

4

4 に答える 4

3

おそらく、メモリは、ボクシング/アンボックスなど、メモリの小さなブロックを作成および解放する多数の文字列操作またはその他の操作から断片化されています。

この例外は、CLRが十分な大きさの空きメモリブロックを割り当てることができない場合に発生します。

「CLRプロファイラー」を使用して、メモリの割り当てを確認します。多数のホワイトスポット(空きブロック)が表示され、大きな空きブロックが表示されない場合は、オブジェクトの割り当て方法を確認する必要があります。

たとえば、ある文字列を別の文字列に割り当てる前に、まず文字列が異なるかどうかを確認してください。StringBuilderを使用することはすべての場合であり、ボクシングやその他のメモリの最適化を排除します。

私はこの手法を使用し、バイナリの逆シリアル化に関する既知の問題を除いて、例外を完全に排除しました。

http://msdn.microsoft.com/en-us/magazine/cc163856.aspx、マネージコードの失われたメモリ最適化の技術を再発見してください。

http://msdn.microsoft.com/en-us/magazine/cc163528.aspxでメモリの問題

Visual Basic .NETのパフォーマンスの最適化( http://msdn.microsoft.com/en-us/library/aa289513(v = vs.71).aspx)

于 2012-02-01T10:13:05.377 に答える
1

Windows 用のデバッグ ツールをインストールし、adplusを使用することを検討してください。

ADPlus.vbs (ADPlus) は、Microsoft Product Support Services (PSS) のツールで、応答を停止 (ハング) または失敗 (クラッシュ) するプロセスまたはアプリケーションのトラブルシューティングを行うことができます。

基本的に、アプリケーションを監視するように設定できます。アプリケーションがクラッシュすると、ダンプがキャプチャされ、WinDBG/SOS を使用して分析できます。

于 2012-02-01T09:11:38.323 に答える
1

MemoryFailPointを使用して、特定の操作に対していくつかの保証を試みることができます。

ただし、アプリが実行されているプロセスを分離し、それがオプションである場合は 64 ビットに移行することをお勧めします。また、メモリ使用量を合理的に保証するためにパフォーマンスを下げることを検討する必要がある場合もあります。

于 2012-02-01T10:00:05.477 に答える
0

キャッシュに弱参照を使用するのはどうですか? クリック音

于 2012-02-01T08:51:40.503 に答える