我们有一个 Java 进程,我们将其作为 Windows 服务运行(使用 srvany)。它运行 Java 1.6(目前为 1.6.0.23)。
在过去(Windows XP),我可以将 JConsole 连接到进程,在 Windows 7 上我不能再这样做了。
如果我运行
jconsole <pid>
,我会得到“无效的进程ID:4488”。这些服务以系统用户身份运行。
如果我以桌面用户身份运行该服务(使用“以此帐户登录”),服务进程 ID 会出现在 JConsole 中,但它们呈灰色,我无法连接。
当 Java 进程作为 Windows 7 服务运行时,是否无法动态连接到它们?
可能是64位/32位的问题,我有几个用32位JDK编译的应用程序,在Windows 7 64位上无法用64位JDK的JConsole打开,在我下载32位JDK后它可以工作。
其他人已经能够在 2008r2 上运行 jstack ,这可能会提供有关如何让 jconsole 在 Windows 7 上连接的一些见解。正如您在评论中指出的那样,权限很重要。如果服务和 jconsole 无法访问临时目录以写入相应的 hsperf 子目录,则它将无法工作。同样重要的是临时目录的位置、运行服务的用户以及运行 jconsole 的用户。
运行 SysInternals
psexec -s -i <jdk_home>\bin\jconsole <PID>
可用于将 jconsole 作为本地系统运行,我相信您正在使用该用户来运行服务。
我在 Server 2008 中以系统用户身份从 JDK 1.5 运行 jconsole 的经历并不成功。凭借我认为应该足够的权限,我收到了无法打开 PerfMemory 错误。 Java 1.6 可能是一个不同的故事。
鉴于在本地运行 jconsole 的所有挑战,您可能会运气更好将其设置为接受远程连接。您可以将其设置为仅限本地访问,并使用防火墙阻止该端口进行外部访问。
将以下内容添加到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
我目前在 Windows 2003 R2 (SP2) 上遇到同样的问题。 Oracle Bug 数据库中有一个未解决的 bug(bug id 6399729) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6399729
最后还发布了一个解决方法。它讨论了在“安装”模式下安装 java :-),但在 Windows 2003 上对我不起作用。但您的里程可能会有所不同!!
将环境变量 TEMP 和 Tmp 更改为您创建的其他文件夹。 就像 c: heTemp
可能是文件夹的问题
%TMP%/hsperfdata_{USER_NAME}
。
就我而言,它在我之后起作用了:
%TMP%/hsperfdata_{USER_NAME}
(例如:C:/Temp/hsperfdata_MyUser
)希望有帮助。您还可以在 Oracle 社区中查看此主题。
对于可能在 2023 年遇到此问题的其他人来说,好消息是:可能很简单,只需在运行之前以“管理员身份”运行命令提示符即可。
我发现在尝试连接到作为服务运行的jvm(如Neil)时出现此错误(“jconsole <pid>
”,在jconsole的弹出屏幕中)(并且将“登录为”值设置为“本地系统”)。只需以管理员身份打开 cmd 提示符即可让 jconsole(和其他 JVM 工具)正常工作。
FWIW,请注意,如果您不使用 pid 参数,您将不会在“本地进程”连接选项卡中看到该进程(即使您提供它,也可以连接到它)。当然,如果您在 jvm 中启用 JXM args,那么您可以使用“远程进程”选项卡访问它。我意识到这是一个非常古老的问题,当 Neil 在 2011 年第一次写这个问题时,情况可能有所不同。但我提供它,以防它对其他可能在这里找到问题的人有所帮助。我已经用 Java 8、11 和 17 确认了这一点。