为什么在配置JMX时Java打开3个端口?
我在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"
当我检查打开哪些端口时,我发现另外两个随机端口:
netstat -plunt | grep javatcp 0 0 :::9123 :::* LISTEN 13295/java
tcp 0 0 :::59927 :::* LISTEN 13295/java
tcp 0 0 :::59928 :::* LISTEN 13295/java
请注意,每个仅重新启动配置的端口9123保持不变,并且另外两个端口更改值。
netstat -plunt | grep javatcp 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连接时不使用一个端口?
不幸的是,附加的随机端口仍然打开为了提醒您,我使用Centos6。我的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/javatcp 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/javatcp 0 0 :::36252 :::* LISTEN 2348/java
tcp 0 0 :::9123 :::* LISTEN 2348/java
顺便说一句,为什么我::ffff:127.0.0.1
在RMI端口之前看不到?
它与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/javatcp 0 0 :::9123 :::* LISTEN 13597/java
附加运行:
tcp 0 0 :::58356 :::* LISTEN 13629/javatcp 0 0 :::9123 :::* LISTEN 13629/java
我成功打开了Java上的错误:http
:
//bugs.java.com/bugdatabase/view_bug.do?bug_id=8035404
回答:
与通常的看法相反,JMX /
RMI不需要打开所有这些端口。实际上,您可以强制它们相同,这意味着一天结束时您只需要在防火墙上打一个洞即可(如果您担心防火墙的话)。
尝试设置系统属性:
com.sun.management.jmxremote.portcom.sun.management.jmxremote.rmi.port
到相同的价值!
显式设置这些将阻止RMI选择随机端口。将它们设置为相同的值将确保它打开较少的端口以进行监听。
这将在Java 7 update 25或更高版本中工作。
回答:
您看到的应用程序打开的第三个端口(或者,如果您遵循了我的建议,则打开了第二个端口)由 Java Attach API使用
。这就是JConsole用于连接到“本地进程”的东西。从Java
6开始,无论com.sun.management.jmxremote
属性如何,默认情况下都会启用Java Attach
API功能。该功能将使用随机端口(又称为OS临时端口),但这并不重要,因为该功能仅允许来自主机本身的连接。如果您真的不喜欢此功能,则可以添加-XX:+DisableAttachMechanism
到命令行以禁用Java
Attach API功能。然后,您将不再看到Java进程(在本例中为Tomcat)在随机端口上侦听。
回答:
对于定制的应用程序,您将使用RMIServerSocketFactory,但这是Tomcat,因此您必须使用Tomcat的JMX远程生命周期监听器来完成。
另一方面,com.sun.management.jmxremote.local.only
从Java
7开始就拥有该属性并不重要。它可以确保仅允许来自主机本身的连接。请注意,JMX库无法通过绑定到回送接口来实现此目的,这肯定是做到这一点的 一种
方法,但由于主机可能具有多个回送接口,因此略有不准确。
实际上,总的来说(除了最新的JDK wrt JMX增补版),我想说的是Tomcat的 JMX远程生命周期侦听器
现在是多余的,除非您想绑定到某些真正奇怪的网络接口。
以上是 为什么在配置JMX时Java打开3个端口? 的全部内容, 来源链接: utcz.com/qa/411670.html