Process jvisualvm不';t列出某些Java进程

Process jvisualvm不';t列出某些Java进程,process,java,jvisualvm,Process,Java,Jvisualvm,我想获得某个Java进程的堆转储(可疑内存泄漏)。但是,当我启动jvisualvm工具时,我看不到任何正在运行的Java进程 我已经在Google上搜索过这方面的内容,并且已经找到了几篇文章,其中提到必须使用启动jvisualvm工具的JDK运行Java进程,以便它能够看到它们。然而,据我所知,情况已经如此。我在本地做所有事情(我可以远程访问机器) 需要考虑以下几点: 这些进程正在防火墙Windows 2008服务器上运行 这些进程正在使用JDKjava.exe可执行文件的重命名版本运行 据我所

我想获得某个Java进程的堆转储(可疑内存泄漏)。但是,当我启动jvisualvm工具时,我看不到任何正在运行的Java进程

我已经在Google上搜索过这方面的内容,并且已经找到了几篇文章,其中提到必须使用启动jvisualvm工具的JDK运行Java进程,以便它能够看到它们。然而,据我所知,情况已经如此。我在本地做所有事情(我可以远程访问机器)

需要考虑以下几点:

  • 这些进程正在防火墙Windows 2008服务器上运行
  • 这些进程正在使用JDK
    java.exe
    可执行文件的重命名版本运行
  • 据我所知,进程正在使用1.6.0_18 JDK运行
  • 其中一个正在运行的进程启动RMI注册表

  • 我正在等待服务器的虚拟化副本,以便处理它(这是一个生产服务器)。但与此同时,;关于为什么我看不到jvisualvm(或jconsole)中的任何过程,有什么想法吗?

    在我做了一些研究之后,Peter的评论似乎是正确的。因为JVM进程是由另一个用户启动的(网络服务帐户,因为它们是由Windows服务启动的),所以它们没有显示在jvisualvm中

    变通办法 由于我可以访问应用程序配置,我找到了以下解决方法,其中包括显式地为目标JVM启用不安全的JMX:

  • 添加以下JVM参数:

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

  • 通过单击文件->添加JMX连接,使用JMX将远程进程添加到jvisualvm。您可以使用端口3333连接到进程。显然,如果您愿意,您可以更改端口

  • 链接到更详细地解释这一点的文章:

    笔记
  • 永久保留JVM设置可能不是一个好主意,因为它们允许任何人通过JMX连接到JVM
  • 如果愿意,还可以向JMX JVM参数添加身份验证

  • 最简单的方法是以管理员身份执行jvisualvm(win:“以管理员身份运行”)。这并不理想,但很有效。所有java进程都可见。

    为什么要重命名java.exe?我很确定VisualVM通过查找所有运行java.exe的进程来获得它的进程列表。在windows中,您无法轻松看到comandline参数,因此您最终重命名/复制了java.exe,以便知道哪个进程是什么。jconsole和VisualVM是用户特定的。如果进程以另一个用户的身份运行,您将无法看到它们,但是您可以打开安全性以允许对它们进行“远程”管理。感谢您的提示,很可能就是这样。这些进程是通过Windows服务启动的,因此它们可能在某些Windows服务帐户下运行。你能提供有关这方面文章的链接吗?另外,请随意回答,如果回答正确,我会批准它。@Peter如果您想查看windows计算机上运行的是什么,以及完整的命令行参数、tcp/ip套接字等,那么您应该使用sysinternals process explorer,就像类固醇上的任务管理器一样。作为一名开发人员,一旦您尝试了它,您将始终希望在您使用的任何windows计算机上使用它。sysinternals套件中还有许多其他非常有用的工具,我也喜欢junction,它为windows带来了真正的类unix符号链接。谢谢!正是我想知道的是+1。我一直对此感到困惑。在Linux上也是这样吗?@DavidBrossard我想是这样,或者至少有一种类似的机制存在,可以像Windows那样限制某些服务。