运行 jmap 时无法打开套接字文件
- 2024-10-09 09:10:00
- admin 原创
- 81
问题描述:
我必须运行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
:
./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 ...
使用
-F
可以进行堆转储吗?我等了 20 分钟,但还没完成。知道为什么吗?
解决方案 1:
jmap
vs.jmap -F
以及jstack
vs.jstack -F
使用完全不同的机制与目标 JVM 进行通信。
jmap/jstack
-F
不使用这些工具运行时,请使用动态附加机制。其工作原理如下。
在连接到 Java 进程 1234 之前,在目标进程的工作目录或 处
jmap
创建一个文件。.attach_pid1234
`/tmp`然后
jmap
发送SIGQUIT
给目标进程,当JVM捕获到信号,发现时.attach_pid1234
,就启动AttachListener
线程。AttachListener
线程创建 UNIX 域套接字/tmp/.java_pid1234
来监听来自外部工具的命令。出于安全原因,当接受连接(来自
jmap
)时,JVM 会验证套接字对等方的凭据是否等于JVM 进程的凭据。这就是为什么euid
如果由不同的用户(即使是 root)运行,它将不起作用的原因。egid
`jmap`jmap
连接到套接字,并发送dumpheap
命令。此命令由 JVM 的线程读取和执行
AttachListener
。所有输出都发送回套接字。由于堆转储是由 JVM 直接在进程内进行的,因此操作非常快。但是,JVM 只能在安全点执行此操作。如果无法达到安全点(例如进程挂起、无响应或正在进行长时间的 GC),jmap
将超时并失败。
让我们总结一下动态附加的优点和缺点。
优点。
堆转储和其他操作由JVM以最大速度协同运行。
您可以使用任何版本
jmap
或jstack
连接到任何其他版本的 JVM。
缺点。
该工具应由与目标 JVM 相同的用户 (
euid
/ )运行。egid
仅可在活动且健康的 JVM 上使用。
如果目标 JVM 是用 启动的,那么将不起作用
-XX:+DisableAttachMechanism
。
jmap -F / jstack -F
使用-F
工具运行时,切换到具有HotSpot Serviceability Agent的特殊模式。在此模式下,目标进程被冻结;工具通过操作系统调试工具(即ptrace
在 Linux 上)读取其内存。
jmap -F
在目标 JVM 上调用PTRACE_ATTACH
。目标进程响应SIGSTOP
信号无条件暂停。该工具使用 读取 JVM 内存
PTRACE_PEEKDATA
。ptrace
每次只能读取一个字,因此需要调用太多次才能读取目标进程的大型堆。这非常非常慢。该工具根据特定 JVM 版本的知识重建 JVM 内部结构。由于不同版本的 JVM 具有不同的内存布局,因此仅当来自与目标 Java 进程相同的 JDK
-F
时,模式才有效。jmap
该工具会自行创建堆转储,然后恢复目标进程。
优点。
无需目标 JVM 的配合。即使在挂起的进程中也可以使用。
ptrace
只要操作系统级权限足够,就可以工作。例如,root
可以转储所有其他用户的进程。
缺点。
对于大堆来说非常慢。
该工具和目标进程应该来自同一版本的JDK。
当工具以强制模式连接时,安全点无法得到保证。尽管
jmap
尝试处理所有特殊情况,但有时仍可能发生目标 JVM 状态不一致的情况。
笔记
有一种更快的方法可以在强制模式下进行堆转储。首先,使用 创建核心转储gcore
,然后运行jmap
生成的核心文件。请参阅相关问题。
解决方案 2:
我刚刚发现 jmap(以及在使用它来生成堆转储时的 jvisualvm)强制要求运行 jmap 的用户必须与运行试图转储的进程的用户是同一用户。
在我的例子中,我想要获取堆转储的 jvm 由 linux 用户“jboss”运行。因此,sudo jmap -dump:file.bin <pid>
报告“无法打开套接字:”的位置,我能够使用以下方法获取我的堆转储:
sudo -u jboss jmap -dump:file.bin <pid>
解决方案 3:
如果您的应用程序作为 systemd 服务运行,则应打开 下的/usr/lib/systemd/system/
并以您的服务名称命名的服务文件。然后检查privateTmp属性是否为真。
如果是 true,则应将其更改为 false,然后按以下命令刷新服务:
`systemctl daemon-reload
systemctl restart [servicename]`
如果要在重启之前运行 jmap/jcmd,可以使用服务文件中的 execStop 脚本。只需将命令放入其中并执行即可systemctl stop [service name]
解决方案 4:
就像ben_wing所说,你可以运行:
sudo -u jboss-as jmap -dump:file.bin <pid>
(在我的情况下用户是jboss-as
,但您的用户可能是jboss
或其他。)
但这还不够,因为它要求我输入密码([sudo] password for ec2-user:
),尽管我可以sudo
使用其他命令运行而无需提示我输入密码。
我在这里找到了解决方案,我只需要先添加另一个sudo
:
sudo sudo -u jboss-as jmap -dump:file.bin <pid>
它也与其他命令(如jcmd
和jinfo
)一起工作。
解决方案 5:
通常用-F 来解决。
正如消息中所述:
The -F option can be used when the target process is not responding
我遇到了完整的 GC 导致无法执行命令的情况。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件