lsof
是一个很好的Unix工具,显示所有当前打开的文件句柄。
有没有人知道一个类似的工具可以显示正在运行的JVM中的所有打开文件(通过JVMTI或任何类似的界面)?
在这种特殊情况下,我知道哪个类的句柄打开就足够了。方法/行甚至整个链到GC根目录都很棒,但处理程序所有者类已经是一个好的开始。
我知道我可以进行堆转储,在分析器中打开它并找到它,但这是一项繁琐的工作,特别是对于大堆。
答案 0 :(得分:1)
JVMTI选项听起来不是一个糟糕的选择。最大的问题是确保你包装可能打开文件句柄的所有东西:你基本上必须通过JDK源代码并找到打开文件的每个本机函数(遍及java.io. ,java。 nio。,我认为java.net。*也可以考虑将套接字视为文件句柄,以及几乎所有其他文件句柄都可以由本机函数打开)然后将它们全部包装起来SetNativeMethodPrefix致电。
我假设这是一些分析人员所做的事情:但是如果你不需要实时进行这个列表,那么我认为使用lsof
或{会更容易{1}}(在Windows平台上)并过滤JVM的进程ID。