首页 > 解决方案 > 为什么即使在机器上运行多个 java 应用程序时也没有 JMX 冲突?

问题描述

像 VisualVM 和 jProfiler 这样的内存分析器(仪器和监控工具)通过 JMX 扩展连接到 Java 应用程序的 JVM(尽管可能有其他连接方式 - 比如 jstatd 等,我已经看到 JMX 很常见)

我对 JMX 的理解:
默认情况下,JMX 必须公开其默认端口(不确定是否有默认端口号),以便内存分析器可以连接。因此,我假设当多个 Java 应用程序使用默认 JMX 配置运行时,在同一台机器上,一定存在 JMX 端口冲突。

但我从来没有注意到这一点。我已经看到 java 应用程序在默认配置下运行良好,并且 Mem Analyzers 可以愉快地同时与这些 java 应用程序中的每一个连接。所以我对 JMX 端口的理解并不完全正确。有人能说一个以上的 java 应用程序如何能够在同一台机器上同时使用默认配置公开 JMX 功能。(??????是JMX为每个java应用程序使用的随机端口????)

标签: javajvmjmxvisualvmjprofiler

解决方案


VisualVM 等工具使用 JMX 和Dynamic Attach 机制来监控本地 Java 虚拟机。

  1. 首先,该工具通过Attach API连接到本地 JVM 。
  2. 然后它执行(也通过 Attach API)命令以在目标 JVM 中启动管理代理(JMX 服务器)。
  3. 目标 JVM 在某个空闲端口上启动管理代理,并在代理属性中设置打开的端口值。
  4. 该工具再次使用 Attach API 来读取代理属性,从而发现代理侦听的端口。
  5. 然后它在此端口上建立到管理代理的 JMX 连接。

显然,不同的本地 JVM 在不同的端口上启动 Management Server,但 VisualVM 通过 Dynamic Attach 发现端口号。


推荐阅读