问题描述
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虚拟机。
- 首先,该工具通过Attach API连接到本地JVM。
- 然后,它(也通过Attach API)执行命令以在目标JVM中启动Management Agent(JMX服务器)。
- 目标JVM在某个空闲端口上启动管理代理,并在代理属性中设置打开的端口值。
- 该工具再次使用Attach API读取代理属性,从而发现代理侦听的端口。
- 然后,它在此端口上建立到管理代理的JMX连接。
很明显,不同的本地JVM在不同的端口上启动Management Server,但是VisualVM通过动态附加发现端口号。