问题描述
在Windows 10系统,之前写了 使用arthas直接操作redis 遇到一个问题:
λ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.1
[INFO] Can not find java process. Try to pass <pid> in command line.
Please select an available pid.
arthas找不到java应用的pid。换jps同样也没有找到。
λ jps
关于hsperfdata
hsperfdata是jvm应用每次运行时记录的性能监控数据。默认在java的临时目录创建。arthas、jps、jconsole等应用,会从hsperfdata目录获取java pid。
arthas找不到java pid,可能的原因有:
- hsperfdata被禁止。hsperfdata由jvm参数
-XX:+UsePerfData控制,默认情况是是打开的。 - 没有权限创建hsperfdata目录。hsperfdata目录默认在java的临时目录创建,名字为
hsperfdata_<username> - 当前用户在hsperfdata目录没有访问权限,不能读写数据。
很有可能是没有hsperfdata目录或者没有访问权限。
解决
先找到java的临时目录。java的临时目录由jvm参数java.io.tmpdir控制。
System.out.println(System.getProperty("java.io.tmpdir"));
在我的电脑上显示结果是
C:\Users\ycwu\AppData\Local\Temp\
账号是ycwu,对应的hsperfdata目录是hsperfdata_ycwu。打开目录发现有这个文件夹。
右键查看属性

没有用户ycwu的访问权限。。。点击编辑->添加...,输入用户名,然后检查名称

确定之后,选择完全控制

保存后再次运行java应用,hsperfdata目录下面创建了pid文件。arthas也能找到java pid了。
ps. linux系统的hsperfdata默认是在/tmp/hsperfdata_<user>
小结
Windows 10的java.io.tmpdir里的hsperfdata目录默认访问权限有问题,导致jps等工具找不到Java pid。手动设置一下就好了。