6

lsofはUnixの優れたツールであり、現在開いているすべてのファイルハンドルを表示します。

実行中のJVM内で開いているすべてのファイルを(JVMTIまたは同様のインターフェイスを介して)表示する同様のツールを知っている人はいますか?

この特定のケースでは、どのクラスがハンドルを開いているかを知るだけで十分です。メソッド/ラインまたはGCルートへのチェーン全体でさえ素晴らしいでしょうが、ハンドラー所有者クラスはすでに良いスタートです。

ヒープダンプを作成し、プロファイラーで開いてこれを見つけることができることはわかっていますが、これは、特に大きなヒープの場合、面倒な作業です。

4

1 に答える 1

1

JVMTI オプションは、悪い選択ではないように思えます。大きな問題は、ファイル ハンドルを開く可能性のあるすべてのものを確実にラップすることです。基本的には、JDK ソース コードを調べて、ファイルを開いているすべてのネイティブ関数を見つける必要があります ( java.io. 、 java.nio.、全体に散らばっています)。ソケットをファイルハンドルと見なし、ファイルハンドルがネイティブ関数によって開かれる可能性がある他のほぼすべての場所を考慮し、それらすべてをSetNativeMethodPrefix呼び出しでラップする場合は、 java.net.* も同様だと思います。

一部のプロファイリング担当者はそれを行っていると思います: ただし、このリストをリアルタイムで作成する必要がない場合は、(Windows プラットフォームで) 使用しlsofたり、handle(Windows プラットフォームで) フィルタリングしたりする方がはるかに簡単だと思います。 JVM のプロセス ID。

于 2011-06-22T15:21:14.007 に答える