用于JVM的lsof对应物?

min*_*das 6 java debugging lsof jvmti

lsof 是一个很好的Unix工具,显示所有当前打开的文件句柄.

有没有人知道一个类似的工具,可以在运行的JVM中显示所有打开的文件(通过JVMTI或任何类似的界面)?

在这种特殊情况下,只要知道哪个类有句柄打开就足够了.方法/行甚至整个链到GC根目录都很棒,但处理程序所有者类已经是一个好的开始.

我知道我可以进行堆转储,在分析器中打开并找到它,但这是一项繁琐的工作,特别是对于大堆.

Fem*_*emi 1

JVMTI 选项听起来似乎是一个不错的选择。最大的问题是确保包装所有可能打开文件句柄的内容:您基本上必须浏览 JDK 源代码并找到打开文件的每个本机函数(遍布 java.io. 、 java.nio.、如果您将套接字视为文件句柄,以及文件句柄可能由本机函数打开的其他任何地方,我也会认为 java.net.* ,然后使用 SetNativeMethodPrefix 调用将它们全部包装起来

我假设这就是一些分析人员所做的:但是,如果您不需要实时执行此列表,那么我认为它会更容易使用lsofhandle(在 Windows 平台上)和过滤您的JVM 的进程 ID。