我必须运行jmap才能进行进程的堆转储。但jvm返回:
jmap
jvm
Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can be used when the target process is not responding
所以我用了-F:
-F
./jmap -F -dump:format=b,file=heap.bin 10330 Attaching to process ID 10331, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.51-b03 Dumping heap to heap.bin ...
jmapvs. jmap -F以及jstackvs. jstack -F使用完全不同的机制与目标JVM通信。
jmap / jstack
在没有-F这些工具的情况下运行时,请使用动态附加机制。其工作原理如下。
Java
.attach_pid1234
AttachListener
/tmp/.java_pid1234
dumpheap
AttachListenerJVM
让我们总结一下动态附加的优点和缺点。
优点
JVM
jstack
缺点
euid/ egid
-XX:+DisableAttachMechanism
jmap -F / jstack -F
使用-F工具运行时,切换到具有HotSpot Serviceability Agent的特殊模式。在这种模式下,目标进程被冻结;这些工具通过操作系统调试工具(即ptrace在Linux上)读取其内存。
HotSpot Serviceability Agent
ptrace
Linux
jmap -FPTRACE_ATTACH
SIGSTOP
PTRACE_PEEKDATA
有一种更快的方法可以在强制模式下进行堆转储。首先,使用创建一个coredump gcore,然后运行jmap生成的core文件。请参阅相关问题。