JMX 端口
JMX 端口
1. 概述
在本教程中,我们将解释为什么 JMX 在启动时会打开三个端口。此外,我们将展示如何在 Java 中启动 JMX。之后,我们将展示如何限制打开的端口数量。
2. JMX 定义
首先让我们定义 JMX 框架是什么。Java 管理扩展 (JMX) 框架为管理 Java 应用程序提供了一个可配置、可扩展和可靠的基础设施。此外,它定义了一个 MBean 概念,用于应用程序的实时管理。该框架允许本地或远程管理应用程序。
3. 在 Java 中启用 JMX
现在让我们看看如何启用 JMX。对于 Java 版本 1.5 及更早版本,有一个系统属性 com.sun.management.jmxremote。使用该属性启动的应用程序可以从本地和远程连接到 JConsole。另一方面,没有该属性启动的应用程序在 JConsole 中不可见。
然而,从 Java 6 及更高版本开始,该参数是不必要的。应用程序在启动后自动可用于管理。此外,默认配置会自动分配端口并仅在本地公开。
在我们的示例中,我们将使用 Java 6 或更高版本。首先,让我们创建一个带有无限循环的类。该类什么也不做,但它允许我们检查哪些端口被打开:
public class JMXConfiguration {
public static void main(String[] args) {
while (true) {
// 确保应用程序不会终止
}
}
}
现在,我们将编译该类并启动它:
java com.baeldung.jmx.JMXConfiguration
之后,我们可以检查分配给进程的 pid 并检查进程打开的端口:
netstat -ao | grep `<pid>`
结果,我们将获得应用程序公开的端口列表:
Active Connections
Proto Local Address Foreign Address State PID
TCP 127.0.0.1:55846 wujek:55845 ESTABLISHED 2604
此外,在重启的情况下,端口将更改。它是随机分配的。自 Java 6 以来,此功能自动公开应用程序以供 Java Attach API 使用。换句话说,它自动公开应用程序以通过本地进程连接到 JConsole。
现在,让我们通过向 JVM 提供选项来启用远程连接:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
端口号是我们必须提供的强制性参数,以便公开 JMX 进行远程连接。我们仅出于测试目的禁用了身份验证和 SSL。
现在,netstat 命令返回:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:1234 wujek:0 LISTENING 11088
TCP 0.0.0.0:58738 wujek:0 LISTENING 11088
TCP 0.0.0.0:58739 wujek:0 LISTENING 11088
正如我们所看到的,应用程序公开了三个端口。RMI/JMX 公开了两个端口。第三个是一个随机端口,用于本地连接。
5. 限制打开的端口数量
首先,我们可以使用 -XX:+DisableAttachMechanism 选项禁用从 JConsole 公开应用程序的本地连接:
java -XX:+DisableAttachMechanism com.baeldung.jmx.JMXConfiguration
之后,应用程序不公开任何 JMX/RMI 端口。
此外,从 JDK 16 开始,我们可以设置本地端口号:
java
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.port=1235
com.baeldung.jmx.JMXConfiguration
现在让我们更改配置并尝试远程端口。
还有一个额外的选项 -Dcom.sun.management.jmxremote.rmi.port=1234,允许我们将 RMI 端口设置为与 JMX 端口相同的值。现在,完整的命令是:
java
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.rmi.port=1234
-Dcom.sun.management.jmxremote.local.port=1235
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
com.baeldung.jmx.JMXConfiguration
之后,netstat 命令返回:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:1234 wujek:0 LISTENING 19504
TCP 0.0.0.0:1235 wujek:0 LISTENING 19504
也就是说,应用程序只公开了两个端口,一个用于 JMX/RMI 远程连接,一个用于本地连接。这样,我们可以完全控制公开的端口并避免与其他进程公开的端口发生冲突。
然而,当我们启用远程连接并禁用附加机制时:
java
-XX:+DisableAttachMechanism
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.rmi.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
com.baeldung.jmx.JMXConfiguration
然后,应用程序仍然公开两个端口:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:1234 wujek:0 LISTENING 9856
TCP 0.0.0.0:60565 wujek:0 LISTENING 9856
6. 结论
在这篇简短的文章中,我们解释了如何在 Java 中启动 JMX。然后,我们展示了 JMX 在启动时打开哪些端口。最后,我们展示了如何限制 JMX 打开的端口数量。
一如既往,示例的源代码可以在 GitHub 上找到。