【问题标题】:Jconsole cannot connect to java processes running as Windows 7 ServicesJconsole 无法连接到作为 Windows 7 服务运行的 java 进程
【发布时间】:2011-06-07 20:09:03
【问题描述】:

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

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

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

如果我让服务以我的桌面用户身份运行(使用“以此帐户登录”),服务进程 ID 会出现在 JConsole 中,但它们是灰色的,我无法连接。

当 Java 进程作为 Windows 7 服务运行时,是否无法动态连接到它们?

【问题讨论】:

  • 您的 JAVA 服务是否可配置为 JMX?
  • 我没有指定任何额外的东西来启用 JMX,默认情况下(使用 1.6 并在命令行运行时确认)它可以工作并且可以在 Windows XP 上工作。
  • 好的,如果启用了 JMX,则使用 JMX URL 和端口连接服务。它应该连接。
  • 这就是问题所在。我通常只通过 PID 而不是端口号进行连接。
  • 文档说“注意 - 在 Windows 平台上,出于安全原因,仅当您的默认临时目录位于允许设置文件和目录权限的文件系统上时,才支持本地监视和管理 (例如,在新技术文件系统 (NTFS) 文件系统上)。文件分配表 (FAT) 文件系统不支持它,因为它提供的访问控制不足。”所以也许这就是在命令行上运行的进程(或作为 Windows XP 服务)和 Windows 7 服务之间的区别。

标签: java service windows-7 jmx


【解决方案1】:

其他人已经能够run jstack on 2008r2 这可能会提供一些关于如何让 jconsole 在 Windows 7 上连接的见解。正如您在评论中指出的那样,权限很重要。如果服务和 jconsole 无法访问 temp 目录以写入相应的 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 可能会更好。您可以将其设置为仅限本地访问,并使用防火墙阻止该端口从外部访问。

【讨论】:

  • 我已经尝试过这个以及更多的测试。以管理员身份运行 jconsole,系统并将服务更改为以我的用户身份运行等,但它总是失败。看来 hsperfdata_username 在所有情况下都是正确创建的。
  • 今天我得到了 PsExec.exe -s "C:\Program Files\Java\jdk1.6.0_13\bin\jstack.exe" 12345 和 jmap.exe 都可以工作,但 jvisualvm 不行。跨度>
【解决方案2】:

我目前面临同样的问题,但在 Windows 2003 R2 (SP2) 上。 Oracle Bug 数据库中存在打开的错误(错误 ID 6399729) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6399729

最后还发布了一个解决方法。它谈到在“安装”模式下安装 java :-),但在 Windows 2003 上对我不起作用。但是您的里程可能会有所不同!

【讨论】:

【解决方案3】:

可能是 64 位/32 位的问题,我有几个使用 32 位 JDK 编译的应用程序,在我下载 32 位 JDK 后,在 Windows 7 64 位上使用 64 位 JDK 的 JConsole 无法打开。

【讨论】:

  • 我的系统上只有 32 位 Java。我们还需要 64 位。我可以用 64 位 Java 试试。
  • 谢谢你,这就是我的问题的解决方案。
  • @Mongo 您的 java 进程是否作为 Windows 服务运行?
  • @NeilWightman 不,抱歉,这个问题是从相关搜索中弹出的,而答案恰好对我有所帮助。我的 jvm 架构在 jconsole 和我的进程之间是不同的,但我没有将它作为 Windows 服务运行。
【解决方案4】:

将以下内容添加到 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

【讨论】:

  • 为我工作。不知道为什么 java 8 仍然需要这些参数,尽管 oracle 明确表示它从 java 6 开始动态地将 jconsole 附加到 java 进程。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    这可能是文件夹%TMP%/hsperfdata_{USER_NAME} 的问题。 就我而言,它在我之后起作用:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多