1.问题: jmap/jinfo 无法attach上jvm进程, jstat可以正常使用
之前一直用Windows/Linux没有这个问题,最近换了Mac尝试了下确实存在
环境: JDK1.8.0_48
表现:
jmap/jinfo均无法attach上jvm进程,提示缺少系统权限[实际已经验证切换root账号启动进程]
can't attach to the process. could be caused by an incorrect pid or lack of privileges
2.查询相关资料: Mac JDK8 小版本bug => 建议升级到 JDK9
JDK8 关于DebuggerException: Can't attach symbolicator to the process的bug,https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8160376
3.解决方案
1.尝试升级 JDK9 => jmap/jinfo 正常输出,问题fix
2.尝试升级 JDK11 => jmap/jinfo 正常输出,问题fix
jhsdb jmap --heap --pid 20283
jhsdb --help
clhsdb command line debugger
debugd debug server
hsdb ui debugger
jstack --help to get more information
jmap --help to get more information
jinfo --help to get more information
jsnap --help to get more information
3.尝试升级 JDK8 其他小版本: 1.8.0_66 / 1.8.0_131 => 问题fix
- 1.root账户启动java进程, jmap/jinfo 可以attach上进程attach上进程
- 2.当前用户启动java进程,jmap/jinfo也可以attach上进程
JDK8 小版本: 1.8.0_66 / 1.8.0_131 验证ok
4.结论:
- JDK8 MacOS下有些小版本下存在无法attach java进程bug。建议升级JDK9以上版本。
- 系统环境中只要有相关执行权限(root或正常账户都可以),并且启动java进程使用的jdk环境和jmap/jinfo/jps这些jvm命令是一个jdk环境正常应该都可以attach上进程。
如果attch不上,检查下:是否存在Idea开发环境中启动java进程和jmap查看进程的jdk版本不一致
比如:Idea中启动项目时用的JDK11, jmap时使用的系统环境变量设置的JDK8 (java -version) check下
版本不一致造成的jmap失败可以参考:
5.感谢
李睿指导帮助,继续加油。