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 文件系统下也会出问题,我还不知道具体原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值