当前位置: 首页 > 面试题库 >

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

龚跃
2023-03-14
问题内容

我在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 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连接时不使用一个端口?

添加以澄清答案

不幸的是,附加的随机端口仍然打开为了提醒您,我使用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/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

顺便说一句,为什么我::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/java
tcp        0      0 :::9123                     :::*                        LISTEN      13597/java

附加运行:

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

答:这是Java的错误

我成功打开了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 update 25或更高版本中工作。

什么是第三个端口?

您看到的应用程序打开的第三个端口(或者,如果您遵循了我的建议,则打开了第二个端口)由 Java Attach API使用
。这就是JConsole用于连接到“本地进程”的东西。从Java
6开始,无论com.sun.management.jmxremote属性如何,默认情况下都会启用Java Attach
API功能。该功能将使用随机端口(又称为OS临时端口),但这并不重要,因为该功能仅允许来自主机本身的连接。如果您真的不喜欢此功能,则可以添加-XX:+DisableAttachMechanism到命令行以禁用Java
Attach API功能。然后,您将不再看到Java进程(在本例中为Tomcat)在随机端口上侦听。

如何使JMX仅在回送接口上侦听

对于定制的应用程序,您将使用RMIServerSocketFactory,但这是Tomcat,因此您必须使用Tomcat的JMX远程生命周期监听器来完成。

另一方面,com.sun.management.jmxremote.local.only从Java
7开始就拥有该属性并不重要。它可以确保仅允许来自主机本身的连接。请注意,JMX库无法通过绑定到回送接口来实现此目的,这肯定是做到这一点的 一种
方法,但由于主机可能具有多个回送接口,因此略有不准确。

实际上,总的来说(除了最新的JDK wrt JMX增补版),我想说的是Tomcat的 JMX远程生命周期侦听器
现在是多余的,除非您想绑定到某些真正奇怪的网络接口。



 类似资料:
  • 问题内容: 我的特定问题与JDK 1.6中使用的JMX有关:如果我正在通过JRE 1.6运行Java进程 在命令行中,Java是否为远程JMX连接选择默认端口? 背景:我目前正在尝试开发一个过程,以提供给客户,使他们能够通过远程机器上的JMX连接到我们的流程之一。目的是帮助他们对实时显示控制台上发生的情况进行远程调试。由于他们的服务水平协议,他们强烈地希望捕获尽可能多的数据,并且如果情况看起来太复

  • 问题内容: 运行下面的代码结果为0? 问题答案: 两个操作数(1和3)是整数,因此使用整数算术(此处为除法)。将结果变量声明为double只会导致除法后发生隐式转换。 当然,整数除法会返回除法四舍五入的真实结果。因此,0.333…此处的结果四舍五入为0。(请注意,处理器实际上不进行任何舍入,但是您仍然可以这样考虑。) 另外,请注意,如果两个操作数(数字)均以浮点数给出;3.0和1.0,甚至只是第一

  • 问题内容: 我遵循了“ 导航抽屉 ”教程,除小故障外,其他所有内容都像魅力一样。我将尽力解释,如果仍然不清楚,我将尝试上传有关该问题的视频。 尝试打开抽屉时只会发生问题,仅在打开时会发生问题,并且有时(并非总是)发生问题。就是说,当我开始打开它时,它会出现毛刺并冻结,打开大约4毫米,并且始终保持相同的距离。然后,如果我向后移动手指,它就不会继续打开或关闭,放开时它会关闭。 请注意: 我已经在多种设

  • 我正在Jboss 6.3.0中部署Come jmxAgent。下面是代码片段: A虽然部署成功,但我能够在日志中看到以下异常: 此外,我无法从jConnor连接到上述url。 注意:jboss容器不在我的本地服务器和其他服务器中。因此JMX url是服务:JMX:rmi:///jndi/rmi://uspnsvulx785.elabs.svcs.lxp.com:1099/jmxrmi/camel

  • 问题内容: 在下面获得了以下生产代码,我正在将其用于新驱动程序。portName是COM4,并且该端口存在于PC上(并且我可以通过超级终端连接到该端口),那么Javacomm为什么会抛出NoSuchPortException?COM4在设备mgr中显示正常。太 问题答案: 尝试使用枚举系统上可用端口的列表,并打印列出的内容。您确定在正确的文件夹中安装了jarfiles和dll吗?如果是,则尝试使用

  • 但是,我在spring-boot文档中发现了以下内容。https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-configuration-classes.html 它赞成使用Java配置而不是XML配置。Java配置中的更改需要重新编译。然而,这让我想到为什么文档偏爱Java配置。 Internet上已经发