如何激活JVM上的JMX以使用jconsole进行访问?
如何激活JVM上的JMX以使用jconsole进行访问?
Answers:
相关文档可以在这里找到:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
使用以下参数启动程序:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
例如这样的:
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar Notepad.jar
-Dcom.sun.management.jmxremote.local.only=false
不是必需的,但没有它,就不能在Ubuntu上运行。该错误将是这样的:
01 Oct 2008 2:16:22 PM sun.rmi.transport. customer .TCPTransport$AcceptLoop executeAcceptLoop
WARNING: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=37278] throws
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported.
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:89)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.run(TCPTransport.java:359)
at java.lang.Thread.run(Thread.java:636)
参见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
还应注意-Dcom.sun.management.jmxremote.authenticate=false
使任何人都可以访问,但是如果仅使用它来跟踪本地计算机上的JVM,则没关系。
更新:
在某些情况下,我无法访问服务器。如果我也设置了此参数,则此问题已解决:-Djava.rmi.server.hostname=127.0.0.1
com.sun.management.jmxremote
的默认值是true
。(多谢晒!)是超级清晰,特别是对那些不太熟悉的JMX NOBS,我使用:com.sun.management.jmxremote=true
参考:docs.oracle.com/javase/8/docs/technotes/guides/management/...
Dcom.sun.management.jmxremote.rmi.port=9011
并在防火墙中打开-仍然无法与防火墙连接起来。有什么想法吗?我错过了什么吗?
在Docker容器中运行会给连接带来一系列其他问题,因此希望对大家有所帮助。我最终需要添加以下我将在下面解释的选项:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${DOCKER_HOST_IP}
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
与在本地使用jconsole不同,您必须宣传与在容器中可能看到的IP不同的IP。您需要${DOCKER_HOST_IP}
用Docker主机的外部可解析IP(DNS名称)替换。
JMX远程和RMI端口
看起来JMX还需要访问远程管理接口(jstat),该接口在仲裁连接时使用其他端口来传输一些数据。我没有立即看到任何明显的地方jconsole
可以设置该值。在链接的文章中,过程是:
jconsole
在启用日志记录的情况下尝试连接jconsole
尝试使用哪个端口iptables
/ firewall
规则,以允许该端口连接虽然可行,但这绝对不是一个自动化的解决方案。我选择了从jconsole升级到VisualVM,因为它可以让您显式指定jstatd
运行端口。在VisualVM中,添加一个新的远程主机,并使用与上面指定的值相关的值对其进行更新:
然后右键单击新的“远程主机连接”,然后 Add JMX Connection...
别忘了勾选的复选框Do not require SSL connection
。希望这应该允许您连接。
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
对于通过SSH传输JMX / RMI的情况,它也是关键。没有这些,远程对象将通过服务器的public / main / ... IP通过一些随机端口进行访问,这些端口不容易转发。
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
任何地方使用- localhost
运行docker映像时我只是使用并转发了端口:-p 9998:9998, -p 9999:9999
等
注意,最新版本的Java 6允许jconsole将自身附加到正在运行的进程,即使在没有JMX声明的情况下启动它也是如此。
如果您可以使用,请考虑使用jvisualvm,因为它提供了有关正在运行的进程(包括探查器)的大量信息。
我正在使用WAS ND 7.0
我的JVM需要在JConsole中监视以下所有参数
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
在Linux上,我使用了以下参数:
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
并且我还进行了编辑,/etc/hosts
以便主机名解析为主机地址(192.168.0.x)而不是回送地址(127.0.0.1)
使用以下命令行参数运行Java应用程序:
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
使用-Dcom.sun.management.jmxremote.ssl = false很重要如果您不想在jmx主机上设置数字证书,则参数。
如果您在IP地址为192.168.0.1的计算机上启动应用程序,请打开jconsole,在远程进程字段中输入192.168.0.1:8855,然后单击连接。
-Dcom.sun.management.jmxremote.ssl=false
?应该jconsole
显示错误,还是只是悄无声息地无法连接?
以及以下命令行参数,
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
有时在linux服务器中,imx连接不会成功。这是因为,在cloud linux主机中,在/ etc / hosts中,以便主机名解析为主机地址。
修复此问题的最佳方法是,从网络中的其他计算机ping特定的linux服务器,并在
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
但是永远不要依赖您使用ifconfig.me从linux服务器获得的ipaddress。您到达那里的IP被屏蔽了一个存在于主机文件中的IP。
首先,您需要检查Java进程是否已经使用JMX参数运行。做这个:
ps -ef | grep java
检查您需要监视的Java进程。如果可以看到jmx rmi参数Djmx.rmi.registry.port = xxxx,请使用java visualvm中此处提到的端口在jmx连接下远程连接它。
如果它不是通过jmx rmi端口运行的,那么您需要使用以下提到的参数运行Java进程:
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
注意:端口号取决于您的选择。
现在,您可以将此端口用于jmx连接。这是港口1234
。
sudo lsof -i:1234
没有为我显示任何内容
步骤1:使用以下参数运行应用程序。
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
上面的参数将应用程序绑定到端口9999。
第2步:通过在命令提示符或终端中执行命令jconsole启动jconsole。
选择“远程进程:”并输入{IP_Address}:9999作为URL,然后单击“连接”按钮以连接到远程应用程序。
您可以参考此链接以获取完整的应用程序。
我遇到了这个确切的问题,并创建了一个GitHub项目来测试和找出正确的设置。
它包含Dockerfile
使用支持脚本的功能,以及docker-compose.yml
用于快速测试的简单方法。