指定JVM进程ID执行jmap/jinfo提示进程不存在,jstat正常求助
问题解决:jmap/jinfo附加JVM进程时提示ptrace到不存在的进程
问题场景
对JVM进程ID 95320执行jmap -heap和jinfo命令时,出现附加失败错误,报错信息显示尝试调用ptrace(PTRACE_ATTACH)到一个不存在的进程(如600191、172336),但jstat工具可正常运行。Java版本为1.8.0_201,具体报错如下:
jmap报错
$ jmap -heap 95320 Attaching to process ID 95320, please wait... Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 600191: No such process sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 600191: No such process at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:163) at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach(LinuxDebuggerLocal.java:278) ...(省略栈跟踪)
jinfo报错
$ jinfo 95320 Attaching to process ID 95320, please wait... Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 172336: No such process sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 172336: No such process
可能原因
- 线程ID与进程ID混淆:HotSpot虚拟机读取/proc目录下的进程线程信息时,误将线程ID当作进程ID尝试附加,通常与/proc目录权限不足或系统线程信息读取异常有关。
- Java版本bug:JDK 1.8.0_201的HotSpot存在附加进程时的ID解析缺陷,在多线程或容器环境中更容易触发。
- ptrace系统调用限制:Linux系统的
ptrace_scope配置限制了进程附加权限,但此场景下报错为“无此进程”,更可能是ID解析问题而非直接权限限制。
解决方法
1. 确认进程权限与状态
- 先确认目标进程95320是否存活:
ps -ef | grep 95320 jps -l - 检查当前用户对
/proc/95320及其子目录的读取权限:
如果权限不足,切换到进程所属用户执行命令。ls -ld /proc/95320 ls -ld /proc/95320/task
2. 绕开直接附加,导出堆文件分析
使用jmap的dump参数直接导出堆快照,避免实时附加的问题:
jmap -dump:format=b,file=heap_dump.hprof 95320
导出完成后,可使用jhat heap_dump.hprof或其他分析工具(如VisualVM)查看堆信息。
3. 临时调整ptrace_scope配置
若系统启用了yama安全模块限制ptrace,可临时关闭测试:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
注意:此操作会降低系统安全性,仅用于临时验证,重启后会恢复默认配置。
4. 升级Java版本
JDK 1.8.0_201的该bug在后续更新版本中已修复,建议升级到1.8u系列的更高版本(如1.8.0_371),或直接迁移到Java 11及以上版本。
5. 容器环境处理
如果进程运行在Docker等容器内,需进入容器内部执行jmap/jinfo命令,避免宿主机与容器的进程ID映射导致的解析错误:
docker exec -it <容器ID/名称> bash # 进入容器后执行jmap命令 jmap -heap 95320
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

