JConsole无法找到进程。

21

我尝试使用JConsole来分析正在运行的进程所使用的内存,但是JConsole不会显示任何进程,尽管我确信有一个进程正在运行(此外,它应该在进程列表中显示JConsole,但它没有显示)。

有人知道为什么它不显示任何进程吗?

干杯

8个回答

17

在窗口提示符下,运行echo %TMP%,它会给你默认的临时目录。进入该目录并找到名为hsperfdata_user的目录,其中user是您的登录名。这是存储您的进程ID的目录。您创建的任何新进程,例如Java应用程序,都会有一个以进程ID命名的新文件。Jconsole将从此目录中选择进程ID。如果您无法在此目录中创建文件,则需要更改权限以允许写入。完成后,请启动新的Java应用程序,查看该目录中是否有新的进程ID文件。一旦确认,就可以启动jconsole了。


2
如果Java进程是从Cygwin启动的,它将具有与预期不同的TEMP文件夹-jconsole,从资源管理器启动将找不到该进程。 - Kai
谢谢詹姆斯!修复权限对我有用! :) - baraka
从cygwin提示符中,需要执行以下命令:export TMP=/cygdrive/C/Users/xxx/AppData/Local/Temp - geert3
在大多数情况下,以管理员身份运行JConsole就能解决问题。 - Anu Shibin Joseph Raj
这个答案也帮助了我解决VisualVM的问题。所以任何在Visualvm应用列表中无法显示本地进程的人都应该尝试此方法。 - Jagath01234

14

我有同样的问题。但是,如果我明确指定PID(如jconsole 1234),jconsole就能够分析该进程。


2
你能提供更多关于如何实现这个的细节吗? - Steve Westbrook
@SteveWestbrook,打开终端,而不是运行“jconsole”,运行“jconsole 1234”,其中1234是您的Java进程的PID。现在关于如何找到Java进程的PID,您可以通过Windows任务管理器或在Linux中运行“ps ax”来完成。 - Anu Shibin Joseph Raj

9

如果您正在Windows上运行jconsole - 只需:

  1. 找到 jconsole.exe
  2. 右键单击它
  3. 选择以管理员身份运行

3

针对我的情况,删除在 %TMP% 目录下的 hsperfdata_USERNAME 目录并关闭所有的 JVMs 会有所帮助。


1

您需要使用与要分析的进程相同的用户启动jconsole。


2
即使我使用相同的用户运行,我仍然无法运行jconsole。 - Gautam
尝试过了,但 jconsole 仍然无法看到我的进程。 - Harvey Lin

1
当被监控的JVM和监控工具(如JConsole/JMC/Java Mission Control,甚至是VisualVM)中%TMP%的值不同时,就会出现此问题。这可能是Cygwin的标准情况(至少在我的情况下:Cygwin+Babun)。最简单的解决方法是将TMP环境变量的值设置为Windows默认值,在启动JVM的shell范围内生效。

1

我刚刚遇到了这个问题

如果你偶然使用了多个jdk(例如SDKMAN),请确保使用与应用程序相同的jdk运行jconsole


1

8年后...我遇到了同样的问题。我只能看到某些进程,但无法看到和监视在Linux的docker容器中运行的任何Java进程。

受到RoyalBigMack的Windows解决方案的启发:

  • 解决方案1。以超级用户身份运行终端(su命令)并运行jconsole
  • 解决方案2。将解决方案1作为一个命令运行,sudo jconsole

只有第一个解决方案适用于我,并且一旦jconsole UI弹出,所有隐藏的进程现在都可见了。


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