長時間実行される複雑な Java アプリケーションがあります。アプリケーションは、ほとんどニュアンスを付けずに、同じ操作を何度も繰り返します。私の問題は、Windows タスク マネージャーが Java プロセス (ファイル ハンドルではない) の多くのリーク ハンドルを表示することです。
アプリケーションをストレスの多い状態でしばらく実行すると、アプリケーションが動かなくなったり、消えたり、ファイルを開こうとしたときに FileNotFoundException が発生したりするなど、奇妙なエラーが発生します (「要求されたサービスを完了するにはシステム リソースが不足しています」)。
Windows タスク マネージャーを使用して問題を確認したところ、java.exe プロセスのハンドル数が急速に増加していることがわかりました。スレッドの数は増加せず、使用される RAM の量も増加しません。
次に、これらのハンドルが何であるかを理解するために、SysInternal の Process Explorer を使用しました。これらはファイル ハンドルではなく、\BaseNamedObjects\??????n という名前の「Mutant」タイプの何千ものハンドルであることがわかります。Web のいくつかのサイトによると、Mutant in Process エクスプローラーは Mutex を意味します。私の Java アプリは意図的にミューテックスを作成しません。
次のステップは、プロファイリング ツールを使用して、リークの原因を絞り込むことでした。「J Optimizer」と「Java VirtualVM」を使用しました。両方のアプリケーションで、漏れているハンドルを検出できません。メモリリーク検出器がありますが、ハンドルのリークを検出する方法が見つかりません。
私の質問は次のとおりです。この問題をどのようにデバッグできますか? ハンドルの漏れの原因を特定するにはどうすればよいですか?
ありがとうございました