java - 为什么即使在机器上运行多个 java 应用程序时也没有 JMX 冲突?
问题描述
像 VisualVM 和 jProfiler 这样的内存分析器(仪器和监控工具)通过 JMX 扩展连接到 Java 应用程序的 JVM(尽管可能有其他连接方式 - 比如 jstatd 等,我已经看到 JMX 很常见)
我对 JMX 的理解:
默认情况下,JMX 必须公开其默认端口(不确定是否有默认端口号),以便内存分析器可以连接。因此,我假设当多个 Java 应用程序使用默认 JMX 配置运行时,在同一台机器上,一定存在 JMX 端口冲突。
但我从来没有注意到这一点。我已经看到 java 应用程序在默认配置下运行良好,并且 Mem Analyzers 可以愉快地同时与这些 java 应用程序中的每一个连接。所以我对 JMX 端口的理解并不完全正确。有人能说一个以上的 java 应用程序如何能够在同一台机器上同时使用默认配置公开 JMX 功能。(??????是JMX为每个java应用程序使用的随机端口????)
解决方案
VisualVM 等工具使用 JMX 和Dynamic Attach 机制来监控本地 Java 虚拟机。
- 首先,该工具通过Attach API连接到本地 JVM 。
- 然后它执行(也通过 Attach API)命令以在目标 JVM 中启动管理代理(JMX 服务器)。
- 目标 JVM 在某个空闲端口上启动管理代理,并在代理属性中设置打开的端口值。
- 该工具再次使用 Attach API 来读取代理属性,从而发现代理侦听的端口。
- 然后它在此端口上建立到管理代理的 JMX 连接。
显然,不同的本地 JVM 在不同的端口上启动 Management Server,但 VisualVM 通过 Dynamic Attach 发现端口号。
推荐阅读
- asp.net-mvc - 使用 Visual Studio 代码调试 ASP .Net MVC 应用程序(不是 .Net Core)的可能性
- javascript - 角度等效 vue v-bind="$props"
- flutter - Flutter:需要触发/重新运行 StreamProvider QuerySnapshot 流
- java - 通过 Jumpbox/Proxy 从我的本地机器连接到远程 MySQL
- c - 这里的代码在代码块中完美运行,但在 codechef IDE 中它给出了 SIGTSTP(运行时错误并在输出中显示很多 0)
- php - 嵌套 simple-html-dom file_get_html($url)
- javascript - WebRTC切换摄像头
- javascript - 将内容可编辑的表格数据输入限制为一个带一位小数的数字
- powershell - 是否可以从文件中提取元数据,例如内容创建日期 - 我无法使用 PowerShell
- javascript - 可以从网站的根目录访问 NODE.JS 库吗?