出于某种奇怪的原因,我无法使用VisualVM或连接jconsole到JMX.
用于启动要监视的VM的参数:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100
我检查过,我可以从本地和远程telnet到这个端口.
尽管如此,在花费了相当多的时间尝试之后,VisualVM或jconsole仍无法连接.
REMOTE MACHINE with JMX (debian)
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)
MY WORKSTATION (OS X)
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)
问题是什么?
我在Centos6上使用JDK7运行我的Java程序.我使用以下选项启用JMX:
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9123 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true"
Run Code Online (Sandbox Code Playgroud)
当我检查打开哪些端口时,我发现了2个额外的随机端口:
netstat -plunt | grep java
tcp 0 0 :::9123 :::* LISTEN 13295/java
tcp 0 0 :::59927 :::* LISTEN 13295/java
tcp 0 0 :::59928 :::* LISTEN 13295/java
Run Code Online (Sandbox Code Playgroud)
请注意,每次重启仅配置的端口9123保持不变,另外两个端口会更改值.
netstat -plunt | grep java
tcp 0 0 :::9123 :::* LISTEN 13331/java
tcp 0 0 :::59932 :::* LISTEN 13331/java
tcp 0 0 :::59933 :::* LISTEN 13331/java
Run Code Online (Sandbox Code Playgroud)
什么是2个额外端口以及为什么打开它们?
如何配置2个额外的随机端口?
如何配置::ffff:127.0.0.1将在JMX打开的所有端口之前显示?
为什么在与JConsole连接时不使用一个端口?
添加以澄清答案
不幸的是,附加的随机端口仍然打开为了提醒您,我使用Centos 6.我的Tomcat设置看起来像这样(Tomcat不部署任何应用程序):
CATALINA_OPTS="${CATALINA_OPTS} -XX:+DisableAttachMechanism -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.sun.management.jmxremote.port=9123 -Dcom.sun.management.jmxremote.rmi.port=9123" …Run Code Online (Sandbox Code Playgroud) 我通过ssh远程阅读Visual VM,但我认为我还没有完全理解,因为它不适合我:-(请有人举个例子吗?
ssh -D 9696 login@ip.of.external.machine并visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true启动visualvm,但没有显示外部机器的进程(只有像visualvm本身的本地进程).此外,有时(但并非总是)我在ssh窗口中收到消息"通道3:打开失败:连接失败:连接被拒绝".
有帮助吗?
我想使用jmx或jstatd通过ssh隧道(到EC2机器)使用visualvm app.我该怎么做呢?以下是已尝试(和失败)的列表:(顺便说一句:如果视觉vm不合适,如何在远程计算机上找到内存泄漏?)
我在EC2机器上设置了jstatd服务器(应用程序已在其上运行)然后我设置隧道映射本地端口3333到远程端口1099在VisualVM中我尝试使用端口3333上的jstatd进行连接...没有进程在EC2上出现了
这个链接说jstatd打开另一个端口:http: //rukuro-blog.heroku.com/2011/06/30/monitoring-remote-java-applications-with-visualvm ...所以我从本地主机隧道传输该端口远程.我重新启动了视觉vm ...仍然没有
当我尝试使用folloing命令列出从EC2运行的进程时:
jps -l -m -v rmi://localhost
Run Code Online (Sandbox Code Playgroud)
......我得到了一份流程清单
当我在家用机器上列出它时
jps -l -m -v rmi://localhost:3333
Run Code Online (Sandbox Code Playgroud)
......我没有!那么,rmi端口是不是与jstatd端口(3333)隧道连接......?
我使用以下命令在远程计算机上启动了应用程序:
java -Dcom.sun.management.jmxremote.port=3333 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false\
-cp :post/* <appName>
Run Code Online (Sandbox Code Playgroud)
...该应用程序工作,所以我隧道本地端口3333到远程3333
然后我尝试从visual vm界面设置一个jmx链接到localhost:3333:...它弹出一个错误说:
cannot connect to localhost:3333 using service:jmx:rmi:///jndi/rmi://localhost:3333/jmxrmi
Run Code Online (Sandbox Code Playgroud)
如果我需要设置删除RMI服务器的链接,我不知道该怎么做.
这有希望,但有些事情是不对的:
首先,我将jmx_remote jar添加到类路径中,并使用与上面显示的JMX情况相同的命令在远程计算机上启动应用程序.我在oracle下载链接找到了jar
我从本地端口3333到远程端口3333设置了一个ssh隧道.然后我在calsspath中使用相同的jmx_remote文件启动了visualvm.
visualvm -cp:a ~/jmx/jmxremote_optional.jar
Run Code Online (Sandbox Code Playgroud)
然后我尝试将visualvm连接到远程服务器:
service:jmx:jmxmp://localhost:3333
Run Code Online (Sandbox Code Playgroud)
现在,visual vm似乎试图无限连接.它在状态栏中显示"添加服务:jmx:jmxp:// localhost:3333"...并且一直这样做,直到我关闭远程端的应用程序,此时它会弹出一个弹出窗口,说它无法连接与服务器.
我尝试使用JMX和jstatd失败了.
我不确定SOCKS代理是否正常工作,所以这是我尝试连接的方式:
ssh -i ~/.ssh/starter.pem -v -D 9696 user@host
Run Code Online (Sandbox Code Playgroud)
为了完整起见,我在另一端启动了命令:
java -Dcom.sun.management.jmxremote\
-Dcom.sun.management.jmxremote.ssl=false\
-Dcom.sun.management.jmxremote.authenticate=false\
-Dcom.sun.management.jmxremote.port=3333 <app>
Run Code Online (Sandbox Code Playgroud)
在本地端,我根据LINK到VisualVm帮助页面设置了 …
我使用-Djava.rmi.server.hostname = localhost选项使rmi仅在localhost上侦听,但netstat显示套接字正在侦听0.0.0.0.
奇怪的是RMI RenewClean线程显示它使用localhost.例如RMI RenewClean- [localhost:59357]
我假设如果我设置-Djava.rmi.server.hostname = localhost它应该只在127.0.0.1上侦听
我误解了java.rmi.server.hostname控制的内容吗?
我在我的macbook上运行Jconsole并尝试连接到没有图形的ec2上的linux终端(只有命令行访问).
我像这样运行我的代码:
java -jar program.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9005
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.remote.ssl=false
Run Code Online (Sandbox Code Playgroud)
我在这里读到通过EC2访问时出现问题(连接后出现问题)并且解决方案似乎是' java.rmi.server.hostname to the public hostname of the instance'
我对如何做到这一点感到有点困惑.我尝试了两件事,一件是将它直接放在我的代码中(在void static main部分中):
System.setProperty( "java.rmi.server.hostname" , "external_EC2_address" ); //in my real code I have the correct address here
Run Code Online (Sandbox Code Playgroud)
系统接受了它(当我创建/上传runnable jar时没有错误).我还在我的实例上打开防火墙以允许所有TCP流量.没运气.我尝试上述声明也作为启动程序的标志,但仍然没有运气.
有什么想法怎么做?
更新:这将显示我在Java的绿色,我更进一步(仍然无法工作),但我意识到把java -jar filename.jar,然后选项没有给我与放我的相同的结果-jar在命令的末尾.我试过了,程序试图连接,然后说连接失败(之前它只是在登录界面说它).
我的Spring应用程序运行在NAT防火墙(pfSense)后面的机器上.机器的内部IP是a.b.c.d,NAT IP是w.x.y.z
Spring配置的serviceUrl设置为a.b.c.d端口上的内部IP()1100,当我启动应用程序时,我提供以下开关:
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=w.x.y.z -Dcom.sun.management.jmxremote.port=1099 -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)
如上所示,我进行了设置-Djava.rmi.server.hostname=w.x.y.z,以便可以通过NAT连接到应用程序.我还打开了机器防火墙上的相关端口,并设置了一个从w.x.y.z:1100前往的端口a.b.c.d:1100
当我尝试使用jconsole从网络外部连接到应用程序时w.x.y.z:1100,我得到了一个java.io.IOException: jmxrmi
java.io.IOException: jmxrmi
at sun.tools.jconsole.ProxyClient.checkSslConfig(ProxyClient.java:236)
at sun.tools.jconsole.ProxyClient.<init>(ProxyClient.java:127)
at sun.tools.jconsole.ProxyClient.getProxyClient(ProxyClient.java:483)
at sun.tools.jconsole.JConsole$3.run(JConsole.java:524)
Caused by: java.rmi.NotBoundException: jmxrmi
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:136)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) …Run Code Online (Sandbox Code Playgroud)