2

サービスである.NET2.0アプリケーションがあり、主に.NETリモーティングを介して複数のクライアントが接続されています。サービスは、本番環境中にクライアントサイトでOutOfMemory例外を使用してクラッシュするため、現在、予期しないクラッシュを回避するために、毎日かそこらでサービスを再起動する必要があります。

以前は、マネージコード(静的コレクションが保存されているオブジェクトをクリーンアップしない静的コレクションと、論理スレッド数が継続的に増加している別のケース)で、メモリリークのいくつかのケースを正常に解決しました。したがって、私はメモリダンプをキャプチャし、WinDbg+SOSでそれらを検索することにかなり精通しています。

ただし、この場合、プライベートバイトは増加していますが、すべてのヒープのバイトは安定したままであり、アンマネージコードのメモリリークを示しています。実際のOOM例外を伴うクラッシュダンプを受け取りました。これにより、次のことがより明確になります。

!address -summary

.NETアプリケーションのアンマネージコードのリークの処理に関するTessFerandezのブログ、およびネット上の他のリソースを確認して、多くのダイナミックアセンブリ、一般的なXmlSerializerの問題、またはサードパーティのネイティブDLL(そこにある)などの問題を除外しました。ありません)。ただし、周りにはかなりの数のP/Invokesがあります。先に進むと、ヒープをチェックすると、次のように返されます。

ヒープ

2番目のコマンドは、すべてのエントリも返しました。今、私が読​​んだいくつかのものによると、スタックを取得するには!heap -p -aを実行する必要がありますが、取得するのは

これ

この質問によると、これは誤ったgflagsの使用法などです。ただし、サービスをローカルで開始し、それにデバッガーを接続することは、現在のところオプションではありません。簡単に言うと、クライアントと同様の構成と負荷で環境をセットアップして実行する必要がありますが、これは準備ができていません。

だから、私はかなり立ち往生しています。ここから先に進むか、またはその問題のトラブルシューティングに正しいアプローチを使用している場合でも、わかりません。どんなポインタでも大歓迎です。

編集#1:外部リソースを使用するスレッドのThread.abort。具体的には、OracleのODP.NETプロバイダーを介したデータベース接続。それがネイティブヒープのリークの原因である可能性がありますか?

4

1 に答える 1

2

ただし、周りにはかなりの数のP/呼び出しがあります

編集#1:外部リソースを使用するスレッドのThread.abort

これは、この種の問題を抱えるのに最適な状況の嵐です。それらのいずれかが、それ自体で十分に制御されていないメモリリークを引き起こす場合。確かに、開発マシンではすべてがダンディであるように見えます。しかし、実際のマシンが処理しているような種類のデータロードを実行しているわけではありません。

とにかく.NETの種類ではなく、ツールから多くの助けを得るつもりはありません。スレッドアボートを完全に取り除くことから始めましょう。それは決してうまくいきません。具体的なアドバイスをするのがとても難しいという理由で、あなたは文脈を与えませんでした。偽の自動生成データを使用してデータベースをセットアップすることを確実に追求して、キュービクルの快適さでコード調整の結果を確認できるようにします。十分な速さでリークしないため、大量のデータが必要です。

それでも問題が解決しない場合は、Windows配布用のデバッグツールで利用できるgflags.exeやumdh.exeなどのツールが必要です。現在、SDKの一部です。最後の手段として、それらはデバッグシンボルでのみうまく機能し、Oracleはこれを簡単にするような会社ではありません。彼らのエコシステムは、問題を解決する高給のコンサルタントを脇に置くのに適しています。あなたが正しいものを見つければ、これもうまくいく可能性があります。

于 2012-05-13T21:17:59.677 に答える