サービスである.NET2.0アプリケーションがあり、主に.NETリモーティングを介して複数のクライアントが接続されています。サービスは、本番環境中にクライアントサイトでOutOfMemory例外を使用してクラッシュするため、現在、予期しないクラッシュを回避するために、毎日かそこらでサービスを再起動する必要があります。
以前は、マネージコード(静的コレクションが保存されているオブジェクトをクリーンアップしない静的コレクションと、論理スレッド数が継続的に増加している別のケース)で、メモリリークのいくつかのケースを正常に解決しました。したがって、私はメモリダンプをキャプチャし、WinDbg+SOSでそれらを検索することにかなり精通しています。
ただし、この場合、プライベートバイトは増加していますが、すべてのヒープのバイトは安定したままであり、アンマネージコードのメモリリークを示しています。実際のOOM例外を伴うクラッシュダンプを受け取りました。これにより、次のことがより明確になります。
.NETアプリケーションのアンマネージコードのリークの処理に関するTessFerandezのブログ、およびネット上の他のリソースを確認して、多くのダイナミックアセンブリ、一般的なXmlSerializerの問題、またはサードパーティのネイティブDLL(そこにある)などの問題を除外しました。ありません)。ただし、周りにはかなりの数のP/Invokesがあります。先に進むと、ヒープをチェックすると、次のように返されます。
2番目のコマンドは、すべてのエントリも返しました。今、私が読んだいくつかのものによると、スタックを取得するには!heap -p -aを実行する必要がありますが、取得するのは
この質問によると、これは誤ったgflagsの使用法などです。ただし、サービスをローカルで開始し、それにデバッガーを接続することは、現在のところオプションではありません。簡単に言うと、クライアントと同様の構成と負荷で環境をセットアップして実行する必要がありますが、これは準備ができていません。
だから、私はかなり立ち往生しています。ここから先に進むか、またはその問題のトラブルシューティングに正しいアプローチを使用している場合でも、わかりません。どんなポインタでも大歓迎です。
編集#1:外部リソースを使用するスレッドのThread.abort。具体的には、OracleのODP.NETプロバイダーを介したデータベース接続。それがネイティブヒープのリークの原因である可能性がありますか?