Jconsole 和 jps 无法显示本地 Java 进程列表

前一阵在公司里使用 jconsle 时一切正常,然而在家中的机器上却出现了标题所示的问题: jconsole 和 jps 无法显示本地 Java 进程列表。

当时直接利用 -Dcom.sun.management.jmxremote.port=port 启动目标 java 进程并在 jconsole 中通过 localhost:port 方式成功连接上目标 java 进程。有了这个 work around 之后,对这个问题也就没有太在意。

昨天让在公司兼职的同学开 始熟悉 JMX ,结果在他的机器上也出现了同样的问题,我也同样地用上面的偷懒 work around 解决之。不过今天,同学发给了我这个问题的正解。当时没有细看,回家后才想起又搜了一下,使用的 Google 关键字为“ jconsole jps local process ”,第一个页面就是 SDN 上一个讨论这个问题的帖子,跟下去之后总结如下:

在 Win32 系统上,每个 java 进程启动之后都在 %TMP%\hsperfdata_user ( user 为当前登录用户名)目录下建立一个以该 java 进程 pid 为文件名的文件,用以记录该 java 进程的一些信息。而 jconsole 和 jps 正是利用这些文件来获取当前系统中 java 进程的信息的。根据

http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#win1

的解释,如果该目录位于 FAT 文件系统下,或者位于 NTFS 文件系统下,但当前用户对 %TMP%\hsperfdata_user 目录的访问权限不足,无法创建和写入该文件,jconsole 和 jps 就抓瞎了。

我的情况属于第二种,解决方法自然是对给该目录进行正确的 NTFS 权限设置,方法有不少,比如可以利用 cygwin 下的 chmod 来间接修改 NTFS 的 ACL ,或者直接使用 cacls 来设置该目录的 ACL:

cacls %TMP%\hsperfdata_user /G Everyone:F

以上命令是对所用用户赋予目标目录的所有访问权限——这么做自然是偷了懒……但是当初看 cygwin 手册的时候就被 NTFS 的 ACL 的复杂度给吓到了,一时半会儿实在不想深究这个玩意儿……

另外,为什么该目录位于 FAT 文件系统下也会出问题,我还不知道具体原因。

猜你喜欢

转载自cuiyadll.iteye.com/blog/1998960