由于套接字错误而无法执行 jmap:使用“-F”选项进行强制附加
尝试获取堆转储时使用jmap时,可能会出现“无法打开套接字文件”的错误消息,表明目标进程无响应或HotSpot VM尚未加载。使用“-F”选项是克服此障碍的潜在解决方案。
jmap 与 jmap '-F':独特的操作模式
jmap,当在没有“-F”标志的情况下调用时,利用动态附加机制与目标 JVM 进行通信。该机制涉及一系列步骤:
- 在目标进程的工作目录中创建文件(例如.attach_pid1234)。
- 向目标进程发送 SIGQUIT 信号,提示JVM 启动 AttachListener 线程。
- 建立 UNIX 域套接字,用于从外部工具接收命令。
- 出于安全目的验证连接套接字的凭据(euid 和 egid)。
- 连接到套接字,传输 dumpheap 命令,并从 JVM 的 AttachListener 线程接收输出。
动态附加的优点和缺点:
-
优点:
- 由 JVM 协作执行的高速堆转储。
- 不同版本的 jmap 和 JVM 之间的兼容性。
-
缺点:
- 仅限于与目标 JVM 相同的用户 (euid/egid)。
jmap '-F' 模式:利用 HotSpot 可维护性代理
或者,jmap '-F' 使用 HotSpot 可维护性代理,提供单独的操作模式。在这种情况下,会发生以下步骤:
- 在目标 JVM 上调用 PTRACE_ATTACH,使用 SIGSTOP 信号无条件挂起进程。
- 使用进程 PTRACE_PEEKDATA 读取 JVM 内存由于需要一次读取一个单词,速度明显较慢。
- JVM 内部结构是根据目标 JVM 版本重建的。
- 工具在恢复之前生成堆转储目标进程。
“-F”模式的优点和缺点:
-
优点:
- 无需目标 JVM 配合。
- 甚至可以应用于挂起的进程。
- 特权用户(例如 root)可以转储其他用户的进程。
-
缺点:
- 大堆速度慢。
- 需要匹配版本的 jmap 和目标 JVM。
- 不保证安全点,可能会导致目标 JVM 状态不一致。
以上是为什么在遇到套接字错误时对 jmap 使用'-F”选项?的详细内容。更多信息请关注PHP中文网其他相关文章!