我似乎从来没有让这个工作过去.目前,我知道它不起作用.
但是我们启动了Java进程:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=6002 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
我可以telnet到端口,"有东西"(也就是说,如果我不启动过程,没有任何答案,但如果我这样做,它确实),但我无法让JConsole工作填写IP和港口.
似乎它应该如此简单,但没有错误,没有噪音,没有任何东西.只是不起作用.
有人知道这个热门提示吗?
我有一个解决方案:
如果您的Java进程在防火墙后面的Linux上运行并且您希望在本地计算机上的Windows上启动JConsole/Java VisualVM/Java Mission Control,以将其连接到Java进程的JMX端口.
您需要通过SSH登录访问您的Linux机器.所有通信都将通过SSH连接进行隧道传输.
提示:无论是否有防火墙,此解决方案都能正常运行.
缺点:每次重启 java进程时,都需要再次执行4 - 9的所有步骤.
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html上
至少是putty.exe
jmx-remote-port = 15666
这必须完全像这样.如果它完成如下,它适用于防火墙后面的Linux机器(它起作用的-Djava.rmi.server.hostname=localhost
论点).
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.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
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
ps -ef | grepresult --->
ps -ef | grep ch.sushicutta.jmxremote.Main result ---> 24321
java进程在linux机器上打开一个新的TCP端口,RMI Server-Stubs可供下载.此端口还需要通过SSH隧道才能获得与Java虚拟机的连接.
有了netstat -lp
这个端口,也可以找到lsof -i
提示从java进程打开的端口.
注意:此进程始终在Java进程启动时更改.
netstat -lp | greptcp 0 0 *: *:* LISTEN 24321/java tcp 0 0 *: *:* LISTEN 24321/java result --->
netstat -lp | grep 24321 tcp 0 0 *:15666 *:* LISTEN 24321/java tcp 0 0 *:37123 *:* LISTEN 24321/java result ---> 37123
Source port:Destination: localhost: [x] Local [x] Auto Source port: Destination: localhost: [x] Local [x] Auto
Source port: 15666 Destination: localhost:15666 [x] Local [x] Auto Source port: 37123 Destination: localhost:37123 [x] Local [x] Auto
让putty会话开放.
当您登录时,Putty将通过SSH端口22将所有TCP连接隧道传送到Linux机器.
JMX端口:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer的存根端口:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
这是有效的,因为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:/jmxrmi
[x] Remote Process: service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
添加-Djava.rmi.server.hostname='
为我解决了这个问题.
此解决方案也适用于防火墙
-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
Windows用户:
putty.exe -ssh user@remote-host -L 1616:remote-host:1616
Linux和Mac用户:
ssh user@remote-host -L 1616:remote-host:1616
jconsole
在计算机上启动jconsole localhost:1616
PS:在步骤2中,使用ssh
并-L
指定本地(客户端)主机上的端口1616必须转发到远程端.这是一个ssh隧道,有助于避免防火墙或各种网络问题.
您可能遇到了防火墙问题."问题"是您指定的端口不是唯一使用的端口,它为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隧道并仍然让它工作:-)
在过去几天让我的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\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
我没有看过任何Stack Overflow答案封面的一行是
-Dcom.sun.management.jmxremote.rmi.port=5002
在我的情况下,我试图检索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)
你在Linux上运行吗?管理代理程序可能绑定到localhost:
http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1
通过在步骤3中添加以下行,可以跳过Sushicutta的步骤4-7:
-Dcom.sun.management.jmxremote.rmi.port=
例如,添加以启动参数:
-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
对于端口转发,使用以下方式连接:
ssh -L 12345:localhost:12345@
如果您的主人是踩踏石头,只需在上面的步骤石头上运行以下链接就可以向前移动:
ssh -L 12345:localhost:12345@
请注意,需要hostname = localhost来确保jmxremote告诉rmi连接使用隧道.否则它可能会尝试连接directy并点击防火墙.
专家提示:
RMI端口在任意portnr处打开.如果您有防火墙并且不想打开端口1024-65535(或使用vpn),则需要执行以下操作.
您需要修复(如具有已知编号)RMI注册表和JMX/RMI服务器端口.你可以通过在lib-dir中放置一个jar文件(catalina-jmx-remote.jar,它在extra的中)并在服务器下配置一个特殊的监听器来实现:
(当然是激活JMX的常用标志
-Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Djava.rmi.server.hostname=\
请参阅:http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html上的 JMX远程生命周期监听器
然后你可以使用这个可怕的URL连接:
service:jmx:rmi://:10002/jndi/rmi:// :10001/jmxrmi
检查您的服务器是否在防火墙后面.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"