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

新手上路,请多包涵

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

原文由 Mauli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 879
2 个回答

相关文档可以在这里找到:

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

原文由 Mauli 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 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} 替换为您的 Docker 主机的外部可解析 IP(DNS 名称)。

JMX 远程和 RMI 端口

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

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

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

添加远程主机

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

添加 JMX 连接

不要忘记选中 Do not require SSL connection 的复选框。希望这能让您建立联系。

原文由 Joel B 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题