jcmd执行VM.native_memory失败:权限错误及无效PID问题求助
问题描述
为排查潜在内存泄漏,我尝试用jcmd分析本机内存,操作步骤及遇到的问题如下:
- 应用启动时添加VM参数:
-XX:NativeMemoryTracking=summary
- 通过
jps获取进程PID:
sudo ./jps -l 25125 MyService
- 执行
jcmd命令失败:
常规命令执行报错:
sudo ./jcmd 25125 VM.native_memory 25125: java.io.IOException: well-known file /tmp/.java_pid25125 is not secure: file should be owned by the current user (which is 0) but is owned by 37561 at sun.tools.attach.LinuxVirtualMachine.checkPermissions(Native Method) at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:117) at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63) at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208) at sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:147) at sun.tools.jcmd.JCmd.main(JCmd.java:131)
尝试强制模式也报错:
sudo ./jcmd -F 25125 VM.native_memory Invalid pid specified
- 当前使用的OpenJDK版本:
openjdk version "1.8.0_362" OpenJDK Runtime Environment (build 1.8.0_362-b11) OpenJDK 64-Bit Server VM (build 25.362-b11, mixed mode)
解决办法
方法1:以进程所属用户身份执行jcmd
报错核心原因是/tmp/.java_pid25125文件归用户37561所有,但你通过sudo以root(用户ID 0)身份执行jcmd,权限不匹配。直接切换到进程所属用户执行命令即可:
su - 37561 -c "./jcmd 25125 VM.native_memory"
方法2:临时调整临时文件权限(不推荐,有安全风险)
若无法切换用户,可临时修改/tmp/.java_pid25125的所有者为root:
sudo chown root:root /tmp/.java_pid25125
执行完jcmd分析后,建议立即改回原所有者,避免影响应用正常运行:
sudo chown 37561:37561 /tmp/.java_pid25125
方法3:确认工具与应用的JDK版本一致性
确保你使用的jcmd和目标进程依赖的JDK版本完全一致,不同版本的JDK工具可能存在兼容性问题。可通过以下命令查看应用的JDK路径:
sudo ls -l /proc/25125/exe
然后使用该路径下的jcmd执行分析命令。
内容的提问来源于stack exchange,提问作者yanefedor
相关产品推荐
相关产品推荐

