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

Mau*_*uli 212 java monitoring jvm jmx jconsole

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

Mau*_*uli 275

相关文档可在此处找到:

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
Run Code Online (Sandbox Code Playgroud)

比如这样:

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
Run Code Online (Sandbox Code Playgroud)

-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)
Run Code Online (Sandbox Code Playgroud)

请参阅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

  • 现在还需要Centos上的-Dcom.sun.management.jmxremote.local.only = false (9认同)
  • “-Djava.rmi.server.hostname”对我来说就像一个魅力! (2认同)

Joe*_*l B 65

在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
Run Code Online (Sandbox Code Playgroud)

DOCKER_HOST_IP

与在本地使用jconsole不同,您必须通告一个与容器中可能看到的不同的IP.您需要${DOCKER_HOST_IP}使用Docker主机的外部可解析IP(DNS名称)进行替换.

JMX远程和RMI端口

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

  • 尝试jconsole启用日志记录并从中进行连接
  • 失败
  • 找出jconsole尝试使用的端口
  • 根据需要使用iptables/ firewallrules以允许该端口连接

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

添加远程主机

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

添加JMX连接

别忘了勾选复选框Do not require SSL connection.希望,这应该允许您连接.


Tho*_*sen 9

注意,最新版本中的Java 6允许jconsole将其自身附加到正在运行的进程,即使它在没有JMX咒语的情况下启动也是如此.

如果您可以使用它,还可以考虑使用jvisualvm,因为它提供了有关运行进程的大量信息,包括分析器.

  • 仅当您在与要监视的JVM相同的主机上运行jconsole时,此方法才有效. (3认同)
  • attach API要求jconsole在某些平台上具有与已启动程序相同的32/64位JVM. (2认同)

小智 7

我正在使用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
Run Code Online (Sandbox Code Playgroud)


ale*_*ver 6

在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
Run Code Online (Sandbox Code Playgroud)

我也进行了编辑,/etc/hosts以便主机名解析为主机地址(192.168.0.x)而不是环回地址(127.0.0.1)