gpt4 book ai didi

java - 为什么 Java 在配置 JMX 时会打开 3 个端口?

转载 作者:IT老高 更新时间:2023-10-28 20:34:16 25 4
gpt4 key购买 nike

我在 Centos6 上使用 JDK7 运行我的 Java 程序。我使用以下选项启用 JMX:

JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9123 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true"

当我检查打开了哪些端口时,我发现了另外 2 个随机端口:

netstat -plunt | grep java
tcp 0 0 :::9123 :::* LISTEN 13295/java
tcp 0 0 :::59927 :::* LISTEN 13295/java
tcp 0 0 :::59928 :::* LISTEN 13295/java

请注意每次重启只配置端口9123保持不变,另外两个端口改变值。

netstat -plunt | grep java
tcp 0 0 :::9123 :::* LISTEN 13331/java
tcp 0 0 :::59932 :::* LISTEN 13331/java
tcp 0 0 :::59933 :::* LISTEN 13331/java

另外 2 个端口是什么?为什么要打开它们?

如何配置 2 个额外的随机端口?

如何配置::ffff:127.0.0.1会出现在JMX打开的所有端口之前?

与JConsole连接时为什么不使用一个端口?

添加以澄清答案

不幸的是,额外的随机端口仍然打开提醒你,我使用的是 Centos 6。我的 Tomcat 设置是这样的(Tomcat 不部署任何应用程序):

CATALINA_OPTS="${CATALINA_OPTS}  -XX:+DisableAttachMechanism -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.sun.management.jmxremote.port=9123 -Dcom.sun.management.jmxremote.rmi.port=9123"

Tomcat 进程如下所示:

/usr/java/jdk1.7.0_51/bin/java -Djava.util.logging.config.file=/usr/tomcat-7.0.47/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -XX:+DisableAttachMechanism -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.sun.management.jmxremote.port=9123 -Dcom.sun.management.jmxremote.rmi.port=9123 -Djava.endorsed.dirs=/usr/tomcat-7.0.47/endorsed -classpath /usr/tomcat-7.0.47/bin/bootstrap.jar:/usr/tomcat-7.0.47/bin/tomcat-juli.jar -Dcatalina.base=/usr/tomcat-7.0.47 -Dcatalina.home=/usr/tomcat-7.0.47 -Djava.io.tmpdir=/usr/tomcat-7.0.47/temp org.apache.catalina.startup.Bootstrap start

不幸的是,每次我看到额外的监听端口:

tcp        0      0 :::38830                    :::*                        LISTEN      790/java
tcp 0 0 ::ffff:127.0.0.1:8080 :::* LISTEN 790/java
tcp 0 0 :::9123 :::* LISTEN 790/java

附加运行:

tcp        0      0 ::ffff:127.0.0.1:8080       :::*                        LISTEN      2348/java
tcp 0 0 :::36252 :::* LISTEN 2348/java
tcp 0 0 :::9123 :::* LISTEN 2348/java

顺便说一句,为什么我在 RMI 端口之前看不到 ::ffff:127.0.0.1

第二次添加以澄清评论

它与Tomcat无关。我试图用类似的设置运行 ant:Ant 进程如下所示:

/usr/bin/java -XX:+DisableAttachMechanism -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.sun.management.jmxremote.port=9123 -Dcom.sun.management.jmxremote.rmi.port=9123 -classpath /usr/apache-ant-1.9.2/lib/ant-launcher.jar -Dant.home=/usr/apache-ant-1.9.2 -Dant.library.dir=/usr/apache-ant-1.9.2/lib org.apache.tools.ant.launch.Launcher -cp  sleep

不幸的是,每次我看到额外的监听端口:

tcp        0      0 :::41200                    :::*                        LISTEN      13597/java
tcp 0 0 :::9123 :::* LISTEN 13597/java

附加运行:

tcp        0      0 :::58356                    :::*                        LISTEN      13629/java
tcp 0 0 :::9123 :::* LISTEN 13629/java

答案:是Java的bug

我成功打开 Java 上的错误: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8035404

最佳答案

与通常的看法相反,JMX/RMI 不需要打开所有这些端口。您实际上可以强制它们相同,这意味着最终您只需要在防火墙上打一个洞(如果您关心防火墙)。

尝试设置系统属性:

com.sun.management.jmxremote.port
com.sun.management.jmxremote.rmi.port

到相同的值!!

明确设置这些将阻止 RMI 选择随机端口。将它们设置为相同的值将确保它打开更少的端口来监听。

这适用于 Java 7 更新 25 或更高版本。

第三个端口是什么?

您看到的应用程序打开的第三个端口(如果您遵循我上面的建议,则为第二个端口)由 Java Attach API 使用。这是 JConsole 用于连接到“本地进程”的方法。 Java Attach API 功能从 Java 6 开始默认启用,与 com.sun.management.jmxremote 属性无关。此功能将使用随机端口(也称为操作系统临时端口),但这并不重要,因为该功能仅允许来自主机本身的连接。如果您真的不喜欢此功能,则可以在命令行中添加 -XX:+DisableAttachMechanism 以禁用 Java Attach API 功能。然后您将不再看到在随机端口上监听的 java 进程(在本例中为 Tomcat)。

如何让 JMX 只监听环回接口(interface)

对于定制的应用程序,您可以使用 RMIServerSocketFactory但这是 Tomcat,所以您必须使用 Tomcat 的 JMX Remote Lifecycle Listener .

另一方面,从 Java 7 开始,您拥有 com.sun.management.jmxremote.local.only 属性并不重要。它确保只有来自主机本身的连接被允许。请注意,JMX 库并不能通过绑定(bind)到环回接口(interface)来实现这一点,这肯定是一种的实现方式,但由于主机可能具有多个环回接口(interface),因此也有轻微的不准确。

事实上,总的来说(最近添加到 JDK wrt JMX)我会说 Tomcat 的 JMX 远程生命周期监听器 现在是多余的,除非你想绑定(bind)到一些非常奇怪的网络接口(interface).

关于java - 为什么 Java 在配置 JMX 时会打开 3 个端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20884353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com