当尝试通过JMX连接时,本地Java进程会变为灰色。

9

我在一台Windows XP专业版机器上运行了许多Java进程。当我尝试通过本地JConsole连接这些进程时,这些进程会变成灰色。

但是,我可以在另一台机器上运行相同的进程,并通过该机器上的本地JConsole进行连接。

这两台机器上的进程和JConsole都运行着Java 1.6版本。

这些进程为什么会变成灰色?有什么想法吗?


这两台机器都运行相同的Java 1.6版本吗?我模糊地记得在某些JDK 1.6版本中存在一些与此相关的错误。 - jtahlborn
我使用完全相同的JDK从相同的目录中运行了一个进程和jconsole。但是该进程仍然显示为灰色。 - richs
对的,我正在询问这两个不同的框是否使用相同版本的JDK。 - jtahlborn
我尝试卸载并重新安装了JDK的新版本,但仍然不起作用。但我注意到有一个系统类路径,其中包含一些与QuickTime Java库相关的引用。我希望我当时已经复制了它,但我卸载了QuickTime后,现在一切都正常了。 - richs
10个回答

21

我正在与这个问题做斗争,发现了一个解决方法:

您可以将本地用户的临时目录更改为他们肯定可以访问的目录(例如D:\temp),请确保为您要监视的进程和jconsole进程执行此操作。

还有一件事,似乎会导致问题的是用户名中包含大写字母。该目录始终将被创建为所有小写字母,但仅将其重命名为在任务管理器中显示的名称,问题就会消失:http://planeofthought.com/wp/?p=75


1
谢谢RegRog。你编辑后的链接解决了问题+1。(我仍然不喜欢告诉用户重命名文件夹)。将hsperfdata_<username>目录的名称更改为hsperfdata_<upper_username>对我有用。 - km1
这个对我来说正中下怀。我也遇到了重命名该目录的问题,但是我能够使用Sysinternals Process Explorer工具确定我的SmartSVN副本锁定了该目录。然后我只需关闭SmartSVN,重命名目录,一切都很好。目录以正确的大小写重新创建。 - Robert Patterson
难以置信,这实际上起作用了!即将TEMP和TMP都设置为c:\ temp。难以置信。谢谢! - fool4jesus

5
如果进程以不同的用户身份运行(例如,如果您将它们作为服务启动),则您将无法连接到它们。此外,如果它们在旧版JVM下运行,则很可能也无法与它们通信。
在某些情况下,本地JMX通信机制使用本地文件系统,并且如果权限未正确定义,则可能会出现问题。您是否可能在网络文件系统(NFS、Samba)上运行这些进程?

4

假设您在任务管理器中看到启动Java应用程序所使用的Windows用户名为YOUR_USER_NAME,请检查一个名称类似于hsperfdata_XXXXX(XXXXX应该是您的用户名)的文件夹是否存在于您的临时文件夹中,并确保YOUR_USER_NAME和XXXXX完全相同(注意大小写)。


2
http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
不可附加管理代理程序的应用程序。这些包括在J2SE 1.4.2平台上启动或在J2SE 5.0平台上启动但没有使用-Dcom.sun.management.jmxremotecom.sun.management.jmxremote.port选项的应用程序。这些应用程序在表格中显示为灰色,JConsole无法连接到它们。在图3-1所示的示例连接对话框中,Anagrams应用程序是使用J2SE 5.0平台VM启动的,没有任何管理属性来启用JMX代理,因此以灰色显示,无法选择。 Figure 3-1 Creating a Connection to a Local Process
(来源:oracle.com 尽管文档中写着,但很可能您的进程正在以不同的用户身份运行。您可以作为管理员运行jconsole并尝试连接。

我打开了Windows任务管理器和jconsole,我的Java进程都是同一个用户。 - richs
嗨Tomasz - 以管理员身份运行jconsole并不能解决问题(尽管我认为应该可以)。你遇到过类似情况吗?有趣的是,以管理员身份运行“进程资源管理器”使其能够查看此特定Java进程的进程信息。解决方法是使用 com.sun.management.jmxremote.port 并使用"远程进程" 连接,但对我来说并不是最佳解决方案,因为我有很多正在运行的进程,并为它们分配唯一的端口是有问题的。 - sourcedelica

1
将hsperfdata文件夹的名称更改为任务管理器中找到的用户名相匹配,对我来说,它位于C:\ Users \ pmimgg0 \ AppData \ Local \ Temp \ hsperfdata_pmimgg0。一旦我将hsperfdata_pmimgg0更改为hsperfdata_PMIMGG0,我的本地进程在jconsole上不再变灰。

enter image description here


1
我之前遇到了描述的问题,但得到了更简单的解决方案:只需关闭所有使用Java的程序(如“IntelliJ IDEA”、“SoapUI”等-以解锁临时文件夹),然后删除%TMP%\hsperfdata_<user.name>文件夹。 然后,在打开任何Java程序后,此文件夹将被重新创建,但这次使用正确的名称(很可能是%TMP%\hsperfdata_<User.Name>)。之后,本地Java进程可以再次通过“JConsole”或“VisualVM”(现在可以在VisualVM:故障排除指南中找到链接并无错误启动)进行监视。

1

不必按照这些步骤操作,只需进入命令提示符并键入jconsole.exe (PID)即可。

记得进入jconsole所在的路径,然后运行可执行文件。


1

这是对我有用的方法。我更改了我的%TEMP%%TMP%环境变量,使它们指向我在%HOME%位置创建的文件夹(例如C:\Users\[YOUR_NAME]\Temp)。一旦我这样做了,所有问题都消失了。


0
将环境变量中的TEMP路径更改为类似于D:\ temp之类的内容,因为这可能是权限问题。 这种方法已解决我的问题。

0

最好的方法是像远程进程一样运行本地进程

在运行时参数中添加这些条件 -

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=6001
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=6001

然后选择远程进程并指向本地主机:6001,如图所示

JConsole New Connection

点击连接,Jconsole已成功连接。

对我来说,这是解决了我的一些管理员限制问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接