如何激活我的JVM上使用jconsole进行访问的JMX?

如何激活JVM上的JMX以使用jconsole进行访问?

相关的文档可以在这里find:

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.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

请注意,最新版本的Java 6允许jconsole将自己附加到正在运行的进程,即使它已经在没有JMX咒语的情况下启动。

如果可以的话,也可以考虑使用jvisualvm,因为它提供了关于正在运行的进程的大量信息,包括一个分析器。

在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。 您需要将${DOCKER_HOST_IP}replace${DOCKER_HOST_IP} Docker主机的外部可parsing的IP(DNS名称)。

JMX远程和RMI端口

它看起来像JMX还需要访问远程pipe理接口( jstat ),在仲裁连接时使用不同的端口来传输一些数据。 我没有看到任何地方立即明显在jconsole中设置此值。 在链接的文章中,过程是:

  • 尝试从jconsole连接并启用日志logging
  • 失败
  • 找出jconsole尝试使用哪个端口
  • 根据需要使用iptables / firewall规则来允许该端口连接

虽然这有效,但它当然不是一个可自动化的解决scheme。 我select从jconsole升级到VisualVM,因为它让你明确指定运行jstatd的端口。 在VisualVM中,添加一个新的远程主机,并用与上面指定的相关的值更新它:

添加远程主机

然后右键单击新的远程主机连接并Add JMX Connection...

添加JMX连接

不要忘记选中Do not require SSL connection的checkbox。 希望这可以让你连接。

我正在使用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以便主机名parsing为主机地址(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 

如果您不想在jmx主机上设置数字证书,使用-Dcom.sun.management.jmxremote.ssl = false参数非常重要。

如果您在具有IP地址192.168.0.1的计算机上启动应用程序,请打开jconsole ,在远程进程字段中input192.168.0.1:8855 ,然后单击连接

我有这个确切的问题,并创build一个GitHub项目进行testing和搞清楚正确的设置 。

它包含一个支持脚本的工作Dockerfile ,以及一个用于快速testing的简单docker-compose.yml