我们有一个Java进程,我们作为Windows服务运行(使用srvany)。它运行Java 1.6(目前为1.6.0.23)。
过去(Windows XP),我可以将JConsole连接到进程,在Windows 7上我不能再这样做了。
如果我运行jconsole <pid>
,我会收到“无效的进程ID:4488”。这些服务以SYSTEM用户身份运行。
如果我将服务作为桌面用户运行(使用“以此帐户登录”),服务进程ID将显示在JConsole中,但它们将显示为灰色且无法连接。
当它们作为Windows 7服务运行时,是否无法动态连接到Java进程?
答案 0 :(得分:3)
也许这是一个64位/ 32位的问题,我有几个用32位JDK编译的应用程序,在我下载了它工作的32位JDK后,无法用Windows 7 64bit上64位JDK的JConsole打开。
答案 1 :(得分:1)
其他人已经能够run jstack on 2008r2,它可以提供一些有关如何在Windows 7上连接jconsole的见解。正如您在评论中指出的那样,权限很重要。如果服务和jconsole无法访问临时目录以写入相应的hsperf子目录,则它将无法工作。同样重要的是临时目录的位置,服务运行的用户以及运行jconsole的用户。
运行SysInternals psexec -s -i <jdk_home>\bin\jconsole <PID>
可用于将jconsole作为本地系统运行,我相信您用来运行服务的用户。
我在Server 2008中以JDK 1.5身份运行jconsole作为系统用户的经验不成功。有了我认为应该足够的权限,我得到了一个无法打开的PerfMemory错误。 Java 1.6可能是另一回事。
鉴于在本地运行jconsole的所有挑战,你可能会有更好的运气setting it up to accept remote connections。您可以将其设置为仅限本地访问,防火墙阻止该端口进行外部访问。
答案 2 :(得分:0)
我目前面临同样的问题,但在Windows 2003 R2(SP2)上。 Oracle Bug数据库中有开放的bug(bug id 6399729) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6399729
此外还有最后的解决方案。它讨论了在“安装”模式下安装java :-),但在Windows 2003上并不适用于我。但你的里程可能会有所不同!!
答案 3 :(得分:0)
将以下内容添加到JAVA_OPTION
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
然后, 使用JConsole连接远程会话: 本地主机:8086
答案 4 :(得分:0)
将环境变量TEMP和Tmp更改为您创建的其他文件夹。 像c:\ theTemp
答案 5 :(得分:0)
文件夹%TMP%/hsperfdata_{USER_NAME}
可能有问题。
就我而言,它在我之后有效:
%TMP%/hsperfdata_{USER_NAME}
(例如C:/Temp/hsperfdata_MyUser
)希望有帮助。您还可以在Oracle community中查看此线程。