有没有人有远程JMX JConsole工作?

Wil*_*ung 115 jmx jconsole

我似乎从来没有让这个工作过去.目前,我知道它不起作用.

但是我们启动了Java进程:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Run Code Online (Sandbox Code Playgroud)

我可以telnet到端口,"有东西"(也就是说,如果我不启动过程,没有任何答案,但如果我这样做,它确实),但我无法让JConsole工作填写IP和港口.

似乎它应该如此简单,但没有错误,没有噪音,没有任何东西.只是不起作用.

有人知道这个热门提示吗?

sus*_*tta 124

我有一个解决方案:

如果您的Java进程在防火墙后面的Linux上运行并且您希望在本地计算机上的Windows上启动JConsole/Java VisualVM/Java Mission Control,以将其连接到Java进程JMX端口.

您需要通过SSH登录访问您的Linux机器.所有通信都将通过SSH连接进行隧道传输.

提示:无论是否有防火墙,此解决方案都能正常运行.

缺点:每次重启 java进程时,都需要再次执行4 - 9的所有步骤.


1.您需要从这里获得Windows机器的putty-suite:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html上

至少是putty.exe


2.在linux机器上定义一个空闲端口:

<jmx-remote-port>
Run Code Online (Sandbox Code Playgroud)

例:

jmx-remote-port = 15666      
Run Code Online (Sandbox Code Playgroud)


3.在linux机器上为java进程添加参数

这必须完全像这样.如果它完成如下,它适用于防火墙后面的Linux机器(它起作用的-Djava.rmi.server.hostname=localhost论点).

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
Run Code Online (Sandbox Code Playgroud)

例:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
Run Code Online (Sandbox Code Playgroud)


4.获取Java进程的Process-Id

ps -ef | grep <java-processname>

result ---> <process-id>
Run Code Online (Sandbox Code Playgroud)

例:

ps -ef | grep ch.sushicutta.jmxremote.Main

result ---> 24321
Run Code Online (Sandbox Code Playgroud)


5.为RMIServer存根下载找到任意端口

java进程在linux机器上打开一个新的TCP端口,RMI Server-Stubs可供下载.此端口还需要通过SSH隧道才能获得与Java虚拟机的连接.

有了netstat -lp这个端口,也可以找到lsof -i提示从java进程打开的端口.

注意:此进程始终在Java进程启动时更改.

netstat -lp | grep <process-id>

tcp        0      0 *:<jmx-remote-port>     *:*     LISTEN      24321/java
tcp        0      0 *:<rmi-server-port>     *:*     LISTEN      24321/java


result ---> <rmi-server-port>
Run Code Online (Sandbox Code Playgroud)

例:

netstat -lp | grep 24321

tcp        0      0 *:15666     *:*     LISTEN      24321/java
tcp        0      0 *:37123     *:*     LISTEN      24321/java


result ---> 37123
Run Code Online (Sandbox Code Playgroud)


6.使用putty从Windows计算机启用两个SSH隧道

Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local       
[x] Auto       

Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local       
[x] Auto
Run Code Online (Sandbox Code Playgroud)

例:

Source port: 15666
Destination: localhost:15666
[x] Local       
[x] Auto       

Source port: 37123
Destination: localhost:37123
[x] Local       
[x] Auto
Run Code Online (Sandbox Code Playgroud)


通过Putty打开SSL隧道的设置


7.使用启用此SSH隧道的Putty登录到您的Linux计算机.

让putty会话开放.

当您登录时,Putty将通过SSH端口22将所有TCP连接隧道传送到Linux机器.

JMX端口:

Windows machine: localhost:15666   >>> SSH >>>   linux machine: localhost:15666
Run Code Online (Sandbox Code Playgroud)

RMIServer的存根端口:

Windows Machine: localhost:37123   >>> SSH >>>   linux machine: localhost:37123
Run Code Online (Sandbox Code Playgroud)


8.启动JConsole/Java VisualVM/Java Mission Control以使用以下URL连接到Java Process

这是有效的,因为JConsole/Java VisualVM/Java Mission Control认为您连接到本地Windows计算机上的端口.但Putty将所有有效负载发送到您的linux机器的端口15666.

在linux机器上,首先java进程给出答案并发送回RMIServer端口.在这个例子中37123.

然后JConsole/Java VisualVM/Java Mission Control认为它连接到localhost:37123并且putty会将整个有效负载发送到linux机器

java Process回答并且连接已打开.

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Run Code Online (Sandbox Code Playgroud)

例:

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
Run Code Online (Sandbox Code Playgroud)


通过jmx服务网址连接


9.享受#8-]

  • 我得到了一个提示,我们可以将rmi.port设置为固定端口号,因此我们可以为RMIServer存根下载设置任意端口.这应该与Java属性"com.sun.management.jmxremote.rmi.port = <rmi-server-port>"一起使用.它看起来像是Oracle Java VM中的一个未记录的功能. (5认同)
  • @sushicutta你可以在你的答案中添加这个提示,它的工作完全正常,并且可以删除从4到6的步骤,捕获的是你的转发端口必须与原始端口相同,并且jmx和rmi端口也必须一样的 (2认同)

小智 79

添加-Djava.rmi.server.hostname='<host ip>'为我解决了这个问题.

  • 没有为我解决这个问题.连接windows-2-windows对我来说不是问题但是当我尝试从Windows上的JVM Jvisualvm.exe连接到使用Oracle JDK 1.6.024监视在SUSE上运行的java服务时,它无法连接.出于这个原因,我认为这个人的问题仍然没有答案. (3认同)
  • 在我的情况下,我必须添加IP地址(-Djava.rmi.server.hostname = <ip>).hostname -i给了我两个ip地址,正确的一个是列表中的第二个. (2认同)

fre*_*dev 52

试过Java 8

此解决方案也适用于防火墙

1.将它添加到remote-host上的java启动脚本中:

-Dcom.sun.management.jmxremote.port=1616
-Dcom.sun.management.jmxremote.rmi.port=1616
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
Run Code Online (Sandbox Code Playgroud)

2.在您的计算机上执行此操作.

  • Windows用户:

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Linux和Mac用户:

    ssh user@remote-host -L 1616:remote-host:1616

3. jconsole在计算机上启动

jconsole localhost:1616
Run Code Online (Sandbox Code Playgroud)

4.玩得开心!

PS:在步骤2中,使用ssh-L指定本地(客户端)主机上的端口1616必须转发到远程端.这是一个ssh隧道,有助于避免防火墙或各种网络问题.

  • 真的很糟糕Oracle没有提到"com.sun.management.jmxremote.rmi.port","java.rmi.server.hostname"https://docs.oracle.com/javase/8/docs/technotes/guides/ management/agent.html我想那是我的问题. (2认同)
  • 有用。仅添加我在隧道上的经验:1)可以在“ -L 1616:localhost:1616”中使用“ localhost” 2)无法更改源端口,即,这将不起作用:“-L 9999:localhost:1616” (2认同)

Sim*_*olt 19

您可能遇到了防火墙问题."问题"是您指定的端口不是唯一使用的端口,它为RMI使用1个甚至更多2个端口,并且这些端口可能被防火墙阻止.

如果您使用默认的RMI配置,则不会预先了解其中一个额外端口,因此您必须打开大量端口 - 这可能不会使服务器管理员感到困惑.

有一个解决方案不需要打开很多端口,但我已经使用组合的源代码片段和提示工作了

http://forums.sun.com/thread.jspa?threadID=5267091 - 链接不再有效

http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

甚至可以设置一个ssh隧道并仍然让它工作:-)

  • 我只能使用http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html中描述的别名以及设置-Djava.rmi.server.hostname来解决防火墙问题.另一个答案在这里 (2认同)

Ser*_*gio 17

在过去几天让我的Google-fu进行测试之后,我终于能够在编译Stack Overflow和此页面的答案后开始工作http://help.boomi.com/atomsphere/GUID-F787998C- 53C8-4662-AA06-8B1D32F9D55B.html.

从Dell Boomi页面重新发布:

To Enable Remote JMX on an Atom

If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom.

Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file.

Add the following lines to the file:

-Dcom.sun.management.jmxremote.port=5002
-Dcom.sun.management.jmxremote.rmi.port=5002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Run Code Online (Sandbox Code Playgroud)

我没有看过任何Stack Overflow答案封面的一行是

-Dcom.sun.management.jmxremote.rmi.port=5002
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我试图检索Kakfa指标,所以我只是更改了上面的选项以匹配-Dcom.sun.management.jmxremote.port值.因此,如果没有任何类型的身份验证,最小配置应该如下所示:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=(jmx remote port)

-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=(jmx remote port)
-Djava.rmi.server.hostname=(CNAME|IP Address)
Run Code Online (Sandbox Code Playgroud)

  • 加一为“Google-fu” (2认同)

Cra*_*Day 11

你在Linux上运行吗?管理代理程序可能绑定到localhost:

http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1


小智 7

通过在步骤3中添加以下行,可以跳过Sushicutta的步骤4-7:

-Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>
Run Code Online (Sandbox Code Playgroud)

例如,添加以启动参数:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.rmi.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
Run Code Online (Sandbox Code Playgroud)

对于端口转发,使用以下方式连接:

ssh -L 12345:localhost:12345 <username>@<host>
Run Code Online (Sandbox Code Playgroud)

如果您的主人是踩踏石头,只需在上面的步骤石头上运行以下链接就可以向前移动:

ssh -L 12345:localhost:12345 <username>@<host2>
Run Code Online (Sandbox Code Playgroud)

请注意,需要hostname = localhost来确保jmxremote告诉rmi连接使用隧道.否则它可能会尝试连接directy并点击防火墙.


sup*_*dog 6

专家提示:

RMI端口在任意portnr处打开.如果您有防火墙并且不想打开端口1024-65535(或使用vpn),则需要执行以下操作.

您需要修复(如具有已知编号)RMI注册表和JMX/RMI服务器端口.你可以通过在lib-dir中放置一个jar文件(catalina-jmx-remote.jar,它在extra的中)并在服务器下配置一个特殊的监听器来实现:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
      rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
Run Code Online (Sandbox Code Playgroud)

(当然是激活JMX的常用标志

    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \
Run Code Online (Sandbox Code Playgroud)

请参阅:http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html上的 JMX远程生命周期监听器

然后你可以使用这个可怕的URL连接:

service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi
Run Code Online (Sandbox Code Playgroud)


arg*_*eng 5

检查您的服务器是否在防火墙后面.JMX基于RMI,它在启动时打开两个端口.一个是寄存器端口,默认值是1099,可以通过com.sun.management.jmxremote.port选项指定.另一种是用于数据通信,并且是随机的,这是导致问题的原因.一个好消息是,从JDK6开始,该随机端口可以由该com.sun.management.jmxremote.rmi.port选项指定.

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
Run Code Online (Sandbox Code Playgroud)