jvisualvm 没有列出某些 Java 进程

2022-09-01 02:31:58

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

我已经在Google上发现了这个问题,并且已经发现了几篇文章,说你必须使用与启动jvisualvm工具相同的JDK来运行Java进程,以便它能够看到它们。但是,据我所知,情况已经如此。我在本地执行所有操作(我可以远程访问计算机)。

需要考虑的几件事:

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

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


答案 1

在我做了一些研究之后,彼得的评论似乎是正确的。由于 JVM 进程是由另一个用户(网络服务帐户,因为它们是由 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. 使用 JMX 将远程进程添加到 jvisualvm,方法是单击文件 ->添加 JMX 连接”。您可以使用端口 3333 连接到该进程。显然,如果需要,您可以更改端口。

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

笔记

  1. 永久保留JVM设置可能不是一个好主意,因为它们允许任何人通过JMX连接到JVM。
  2. 如果需要,还可以向 JMX JVM 参数添加认证。

答案 2

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


推荐