40

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

我已经在 Google 上搜索过,并且已经找到几篇文章说您必须使用与启动 jvisualvm 工具相同的 JDK 运行 Java 进程,以便它能够看到它们。但是,据我所知,情况已经如此。我在本地做所有事情(我可以​​远程访问机器)。

有几点需要考虑:

  1. 这些进程在防火墙的 Windows 2008 服务器上运行
  2. 这些进程正在使用重命名的 JDKjava.exe可执行文件版本运行
  3. 据我所见,进程正在使用 1.6.0_18 JDK 运行
  4. 正在运行的进程之一启动 RMI 注册表

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

4

2 回答 2

63

好吧,在我做了一些研究之后,彼得的评论似乎是正确的。因为 JVM 进程是由另一个用户(NETWORK SERVICE 帐户,因为它们是由 Windows 服务启动的)启动的,所以它们没有出现在 jvisualvm 中。

解决方法

由于我可以访问应用程序配置,因此我找到了以下解决方法,其中涉及为目标 JVM 显式启用不安全的 JMX:

  1. 添加以下 JVM 参数:

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

  2. 通过单击 File -> Add JMX Connection,使用 JMX 将远程进程添加到 jvisualvm。您可以使用端口 3333 连接到进程。显然,您可以根据需要更改端口。

链接到更详细地解释这一点的文章:http : //download.oracle.com/javase/6/docs/technotes/guides/visualvm/jmx_connections.html

笔记

  1. 永久保留 JVM 设置可能不是一个好主意,因为它们将允许任何人通过 JMX 连接到 JVM。
  2. 如果需要,您还可以将身份验证添加到 JMX JVM 参数。
于 2011-02-21T10:39:59.087 回答
8

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

于 2017-11-21T09:18:35.707 回答