2011-06-22 10 views
6

lsofはUnix用の素晴らしいツールで、現在開いているファイルハンドルをすべて表示します。lsof JVMの対応ですか?

実行中のJVM内のすべての開いているファイルを表示する同様のツールを知っている人はいますか(JVMTIまたはそれに類するインターフェース経由)。

この特定のケースでは、どのクラスがハンドルを開いているかを知るだけで十分です。メソッド/行、あるいはGC root全体のチェーンさえも素晴らしいだろうが、ハンドラのオーナークラスは既に良いスタートだ。

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

+0

より良いプロファイラを使用することをお勧めします。 ;)YourKitでは、アプリケーションの実行中に開いているファイルをすべて見ることができます。 –

+0

私はYourKitを使用しますが、実際の環境ではプロファイリングを有効にすることはめったにありません。また、YourKitはダンプからのファイルハンドルの表示をサポートしていますか? – mindas

+1

開いているすべてのファイルに使用されているクラスで検索して、ダンプからFileDescriptorを表示することをサポートしています。どのファイルへの参照が保持されているかを確認できます。 –

答えて

1

JVMTIオプションは悪い選択ではないように聞こえます。大きな問題は、ファイルハンドルを開く可能性があるすべてをラップすることです。基本的にJDKのソースコードを調べ、ファイルをオープンしたすべてのネイティブ関数を見つける必要があります(java.io. 、java.nio。、私はjava.net。*と思うでしょう。ソケットをファイルハンドルとみなし、ファイルハンドルがネイティブ関数で開かれている可能性があります)、そしてSetNativeMethodPrefixコールですべてをラップします。

私はそれがプロファイリングの人々の何かをしていると仮定しています。しかし、このリストをリアルタイムで実行する必要がない場合は、lsofまたはhandle(Windowsの場合)プラットフォーム)とJVMのプロセスIDのフィルタリングを行います。

関連する問題