4

長時間実行される複雑な Java アプリケーションがあります。アプリケーションは、ほとんどニュアンスを付けずに、同じ操作を何度も繰り返します。私の問題は、Windows タスク マネージャーが Java プロセス (ファイル ハンドルではない) の多くのリーク ハンドルを表示することです。

アプリケーションをストレスの多い状態でしばらく実行すると、アプリケーションが動かなくなったり、消えたり、ファイルを開こうとしたときに FileNotFoundException が発生したりするなど、奇妙なエラーが発生します (「要求されたサービスを完了するにはシステム リソースが不足しています」)。

Windows タスク マネージャーを使用して問題を確認したところ、java.exe プロセスのハンドル数が急速に増加していることがわかりました。スレッドの数は増加せず、使用される RAM の量も増加しません。

次に、これらのハンドルが何であるかを理解するために、SysInternal の Process Explorer を使用しました。これらはファイル ハンドルではなく、\BaseNamedObjects\??????n という名前の「Mutant」タイプの何千ものハンドルであることがわかります。Web のいくつかのサイトによると、Mutant in Process エクスプローラーは Mutex を意味します。私の Java アプリは意図的にミューテックスを作成しません。

次のステップは、プロファイリング ツールを使用して、リークの原因を絞り込むことでした。「J Optimizer」と「Java VirtualVM」を使用しました。両方のアプリケーションで、漏れているハンドルを検出できません。メモリリーク検出器がありますが、ハンドルのリークを検出する方法が見つかりません。

私の質問は次のとおりです。この問題をどのようにデバッグできますか? ハンドルの漏れの原因を特定するにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

0

リークする参照がどのように割り当てられるかについて知りたい場合は、これを参照してください: Java VisualVM でメモリ割り当てスタックトレースを表示する方法

参照が割り当て解除に失敗した方法を追跡する方法がわかりません。

于 2012-12-25T14:25:21.960 に答える