为什么即使计算机上运行多个Java应用程序,也没有JMX冲突?

问题描述

VisualVM和jprofiler之类的内存分析器(仪器和监视工具)通过JMX扩展连接到Java应用程序的JVM(尽管可能还有其他连接方式,例如jstatd等,我已经看到JMX很常见)

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

但是我从来没有注意到。我见过使用认配置愉快地运行的Java应用程序,而Mem Analyzers可以愉快地同时与这些Java应用程序连接。因此,我对JMX端口的理解并不完全正确。有人可以说一个以上的Java应用程序如何能够在同一台计算机上同时以认配置公开JMX功能。 (????是JMX为每个Java应用程序使用的随机端口???)

解决方法

VisualVM之类的工具将JMX与Dynamic Attach mechanism结合使用来监视本地Java虚拟机。

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

很明显,不同的本地JVM在不同的端口上启动Management Server,但是VisualVM通过动态附加发现端口号。