2011-06-22 18 views
6

lsof是Unix的一個很好的工具,顯示當前打開的所有文件句柄。lsof對應的JVM?

有誰知道一個類似的工具,可以顯示正在運行的JVM中的所有打開的文件(通過JVMTI或任何類似的接口)?

在這種特殊情況下,我知道哪個類的句柄已打開就足夠了。方法/行,甚至整個鏈到GC根將是太棒了,但處理程序所有者類已經是一個好的開始。

我知道我可以做一個堆轉儲,在一個探查器中打開它並找出它,但這是一項單調乏味的任務,尤其是對於大堆。

+0

我建議你使用更好的分析器。 ;)在YourKit中,我可以在應用程序運行時看到所有打開的文件。 –

+0

我使用YourKit,但很少在實時環境中啓用分析。或者YourKit支持從轉儲中顯示文件句柄? – mindas

+1

它支持通過用於所有打開文件的類進行搜索來顯示轉儲中的FileDescriptor。你可以看到引用任何文件的地方。 –

回答

1

JVMTI選項聽起來像它不會是一個不好的選擇。最大的問題是確保你打包所有可能打開文件句柄的東西:你基本上必須通過JDK源代碼並找到每個本地函數打開一個文件(散佈在java.io. ,java.nio中。,我想java.net。*以及如果你考慮套接字作爲文件句柄,並在其他地方,一個文件句柄可能會打開一個本地函數),然後用SetNativeMethodPrefix調用打包它們。

我假設這是一些分析人員所做的:但是,如果你不需要實時做這個清單,那麼我會認爲這將是更容易使用lsofhandle(在Windows平臺)並篩選您的JVM進程ID。