Java 正在运行的jmap无法打开套接字文件
我必须运行jmap
才能进行进程的堆转储。但jvm
返回:
Unable to open socket file: target process not responding or HotSpot VM not loadedThe -F option can be used when the target process is not responding
所以我用了-F
:
./jmap -F -dump:format=b,file=heap.bin 10330Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
- 使用
-F
可以进行堆转储吗? - 我正在等待20分钟,尚未完成。有什么想法吗?
回答:
jmapvs. jmap -F以及jstackvs. jstack -F使用完全不同的机制与目标JVM通信。
在没有-F
这些工具的情况下运行时,请使用动态附加机制。其工作原理如下。
- 连接到
Java
进程1234之前,请在目标进程的工作目录或处jmap
创建一个文件。.attach_pid1234/tmp - 然后
jmap
发送SIGQUIT到目标进程。当JVM捕获信号并找到时.attach_pid1234
,它将启动AttachListener
线程。 AttachListener
线程创建UNIX域套接字/tmp/.java_pid1234
以侦听来自外部工具的命令。- 出于安全原因,当jmap接受(来自)连接时,JVM会验证套接字对等方的凭据euid与egidJVM进程的凭据相同。这就是为什么jmap如果由其他用户(甚至由root用户)运行将无法正常工作的原因。
jmap
连接到套接字,并发送dumpheap
命令。- 该命令由
AttachListenerJVM
的线程读取和执行。所有输出都发送回插座。由于堆转储是由JVM直接在进程内进行的,因此操作速度非常快。但是,JVM只能在安全点执行此操作。如果无法达到安全点(例如,进程挂起,未响应或正在进行长时间的GC),jmap
则将超时并失败。
让我们总结一下动态附加的优点和缺点。
优点
- 堆转储和其他操作由
JVM
以最快的速度协同运行。 - 你可以使用任何版本的
jmap
或jstack
连接到任何其他版本的JVM。
缺点
- 该工具应由与目标JVM 相同的用户(
euid/ egid
)运行。 - 只能在实时健康的JVM上使用。
- 如果目标JVM以启动,则将无法使用
-XX:+DisableAttachMechanism
。
使用-F工具运行时,切换到具有HotSpot Serviceability Agent
的特殊模式。在这种模式下,目标进程被冻结;这些工具通过操作系统调试工具(即ptrace
在Linux
上)读取其内存。
jmap -FPTRACE_ATTACH
在目标JVM上调用。响应SIGSTOP
信号无条件地暂停目标进程。- 具使用读取JVM内存
PTRACE_PEEKDATA
。ptrace
一次只能读取一个单词,因此读取目标进程的大堆需要太多调用。这非常非常慢。 - 该工具根据特定JVM版本的知识来重建JVM内部结构。由于不同版本的JVM具有不同的内存布局,因此-F只有jmap在与目标Java进程来自同一JDK的情况下,模式才有效。
- 该工具会自己创建堆转储,然后恢复目标进程。
优点
- 不需要目标JVM的合作。即使在挂起的进程中也可以使用。
- ptrace只要操作系统级别的特权就足够了,就可以使用。例如,root可以转储所有其他用户的进程。
缺点
- 大堆非常慢。
- 该工具和目标进程应来自相同版本的JDK。
- 当工具以强制模式连接时,不能保证安全点。尽管jmap尝试处理所有特殊情况,但有时目标JVM可能不会处于一致状态。
注意
有一种更快的方法可以在强制模式下进行堆转储。首先,使用创建一个coredump gcore,然后运行jmap生成的core文件。请参阅相关问题。
以上是 Java 正在运行的jmap无法打开套接字文件 的全部内容, 来源链接: utcz.com/qa/423457.html