有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Jconsole无法连接到作为Windows 7服务运行的java进程

我们有一个Java进程,它作为Windows服务运行(使用srvany)。它使用Java1.6(目前为1.6.0.23)运行

在过去(Windows XP),我可以将JConsole连接到进程,但在Windows 7上,我不能再这样做了

如果我运行jconsole <pid>,我会得到“无效的进程id:4488”。服务正在以系统用户身份运行

如果我让服务以我的桌面用户身份运行(使用“以此帐户登录”),则服务进程ID将显示在JConsole中,但它们将灰显,并且我无法连接

当Java进程作为Windows 7服务运行时,是否不可能动态连接到它们


共 (6) 个答案

  1. # 1 楼答案

    我目前在Windows 2003 R2(SP2)上也面临同样的问题。Oracle bug数据库中有一个打开的bug(bug id 6399729) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6399729

    此外,还有一个工作周围张贴到最后。它谈到在“安装”模式下安装java:-),但在Windows 2003上对我不起作用。但是你的里程可能会有所不同

  2. # 2 楼答案

    也许这是一个64位/32位的问题,我有几个应用程序是用32位JDK编译的,在我下载了32位JDK后,在Windows 7 64位上用64位JDK的JConsole无法打开

  3. # 3 楼答案

    其他人已经能够run jstack on 2008r2,这可能会提供一些关于如何让jconsole在Windows 7上连接的见解。正如您在评论中指出的,权限很重要。如果服务和jconsole无法访问temp目录以写入相应的hsperf子目录,那么它将无法工作。同样重要的是临时目录的位置、服务正在运行的用户以及运行jconsole的用户

    运行SysInternalspsexec -s -i <jdk_home>\bin\jconsole <PID>可以用来将jconsole作为本地系统运行,我相信您正在使用这个用户来运行服务

    我在2008年作为系统用户从JDK 1.5中运行jconsole的经验并不成功。有了我认为应该足够的权限,我遇到了一个无法打开内存的错误。Java1.6可能是另一回事

    考虑到在本地运行jconsole的所有挑战,您可能会有更好的运气。您可以将其设置为仅本地访问,防火墙会阻止该端口的外部访问

  4. # 4 楼答案

    将环境变量TEMP和Tmp更改为您创建的其他文件夹。 比如c:\theTemp

  5. # 5 楼答案

    将以下内容添加到JAVA_选项中

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=8086 
    -Dcom.sun.management.jmxremote.ssl=false 
    -Dcom.sun.management.jmxremote.authenticate=false
    

    然后, 使用JConsole连接远程会话: 本地主机:8086

  6. # 6 楼答案

    文件夹%TMP%/hsperfdata_{USER_NAME}可能有问题。 就我而言,在我:

    • 关闭在JVM上运行的所有应用程序
    • 删除文件夹%TMP%/hsperfdata_{USER_NAME}(例如:C:/Temp/hsperfdata_MyUser
    • 重新打开JConsole(它会重新创建文件夹)

    希望有帮助。您还可以在Oracle community中查看此线程