1

C# .NET アプリケーションで「OutOfMemoryException」が発生します。多くの場合、イメージを描画する必要がある場合 (System.Drawing.Image.get_RawFormat) またはスレッドを作成する必要がある場合 (System.Threading.Thread.StartInternal) に発生します。

言うまでもなく、開発マシンでクラッシュを再現することはできません。クラッシュしたアプリケーションのヒープ スナップショットを取得し、Process Explorer を使用して別のクラッシュしたインスタンスを確認しました。

たとえば、あるインスタンスでは、380M のヒープ RAM (問題ないように見えます)、7758 のハンドル (かなり高いように見えます)、2245 の USER オブジェクトと 1798 の GDI オブジェクトがあります)。

素敵なソフト「Process Hacker」を使って「ハンドル型ヒストグラム」を取得することができました。これは、4181 個の「セクション」ハンドル、2834 個の「イベント」ハンドル、および 420 個の「スレッド」ハンドルを示しました。「セクション」ハンドル数は、開発マシンで見つけたものよりもはるかに多くなっています。

「セクション ハンドル リークの原因は何ですか? 」という質問を確認しましたが、残念ながらその回答は役に立ちませんでした。メモリ マップト ファイルや IPC は (少なくとも直接的には) 使用しません。また、この投稿で言及されている関数も使用しません。

アプリケーションのメモリ プロファイルを作成しようとしましたが、明らかなまたは重大なメモリ リークは見つかりませんでした。GC を実行し、メモリ情報/ハンドル数を出力するアプリケーションにフックを追加しましたが、このホット キーを使用すると、実稼働環境でもリークを再現できませんでした。

一部の問題を引き起こす可能性のあるサードパーティ製ソフトウェアを使用しています (DevExpress コントロールおよびその他のコンポーネント)。

現時点では、私はかなり無知であり、あなたのアドバイスを求めたいと思います. 何を確認または調べることができますか? 問題を追跡するにはどうすればよいですか? 助けてくれてありがとう!

4

1 に答える 1

1

このような状況で有効なアプローチは、繰り返しロジックのセクションをコメントアウトすることです。そのほとんどを取り除くことから始め、漏れがないかチェックします。リークがなくなった場合は、リークが元に戻り始めるまで、コードのコメントを少しずつ解除し始めます。面倒ですが、他のオプションが存在しない場合、犯人を突き止めるのに本当に役立ちます.

于 2014-09-18T03:36:40.403 に答える