.NET Remotingを使用して複数のクライアントが主に接続されているサービスである.NET 2.0アプリケーションがあります。サービス中にクライアントのサイトでOutOfMemory例外がクラッシュするため、予期しないクラッシュを避けるため、現在は毎日強制的に再起動しています。ネイティブヒープ関連の.NETアプリケーションでのメモリリーク
以前は、マネージコード(静的コレクションに保存されているオブジェクトのクリーンアップではなく、論理スレッド番号が連続的に増加していた別のもの)でメモリリークの2つのケースを解決しました。だから私はかなりメモリダンプをキャプチャし、WinDbg + SOSでそれらを検索することに精通しています。
しかし、この場合、すべてのヒープ上のバイトが安定している間にプライベートバイトが上昇し、アンマネージドコードメモリリークを示します。私はそれがより明確になり、実際のOOM例外でクラッシュダンプを受け取っ:テスFerandezの.NETアプリケーションにアンマネージコードに漏洩に対処についてのブログだけでなく、周りのいくつかの他のリソースを確認する
ネットでは、ダイナミックアセンブリ、共通XmlSerializer号、またはサードパーティのネイティブDLL(何もありません)の多くの問題を除外しました。しかし、P/Invokeの数が多い。 2番目のコマンドは、同様にすべてのエントリを返さ
:今後、ヒープをチェックすると、次の私に戻りました。今、私は読んでいくつかのものによると、私はスタックを取得する!ヒープ-p -aを実行する必要がありますが、私が得るすべては、this questionに応じしかし、誤ったGFLAGSの使用などである
ですローカルでサービスを開始してデバッガを接続すると、現在ではなく、のオプションがあります。長い話を簡単に言えば、クライアントと同様の設定と負荷で環境をセットアップしなければなりません。これは準備ができていません。
だから、私はかなり固執しています。私はここからどこへ行くべきか、または私がその問題のトラブルシューティングに正しいアプローチを使用している場合でも、わからない。どのポインタも歓迎されている以上のものです。
編集#1:外部リソースを使用するスレッドのThread.abort。具体的には、OracleのODP.NETプロバイダによるデータベース接続です。それがネイティブヒープのリークの原因になりますか?
さらにスタック情報を有効にするために、そのプロセスのgflagsにユーザーモードスタックトレースフラグを設定しましたか?例えばgflags.exe/i process.exe + ust – snowdude
これは、メモリダンプがキャプチャされたクライアントでセットアップすることを意味しますか?はいの場合は、私はそれを見て、それは非常に難しい(それは技術的な理由を超えていないだろう)。 – nantito
ええ、プロセスが実行されているマシン上で実行します。がんばろう。 – snowdude