I've read Visual VM remotely over ssh but I think I've not fully understood because it was not working for me :-( Please can someone give some example?
ssh -D 9696 login@ip.of.external.machine
and visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
starts visualvm, but no processes of external machine are shown (only the local ones like visualvm itself). Moreover sometimes (but not always) I got the message "channel 3: open failed: connect failed: Connection refused" in my ssh window.
Any help?
I know this question is old but i suggest the easier solution instead of using jstat.
just only use SSH and Jvisualvm
Use jvisualvm easy way to detect memory leak and monitor CPU, RAM of application
I have another solution using standard SSH tunneling and no firewall ports to open. For me, SOCKS proxy does not work.
Start your JVM with options:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=[port1]
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[port2]
The important part is "server.hostname=localhost". Additionally, you explicitly define both ports (connect + "random" RMI port), "jmxremote.rmi.port" needs at least Java 7 update 4 (I read somewhere, did not check this info - use "lsof -i" on your server machine to check the really used ports).
(Of course, you may use authentication or SSL.)
Connect via ssh to the server and forward your local port1 and port2 to localhost:port1|2 an the server.
In VisualVM open a JMX connection to localhost:port1 (without any proxy setting).
You either need to run jstatd on the remote side, or specify a JMX connection using host:port.
Jstatd:
jstatd -J-Djava.security.policy=permissions.txt [-p port]
After that: add a remote connection to the target machine, and on the properties of that remote connection configure the jstatd connection.
(permissions.txt contains for example this:
Edit: (Answer to comment)
ssh -D 9696 me@remote
, and run jstatd as above on the remote command line. If you want jstatd to be on a different port than the default 1099, use the -p argument to jstatd.visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
on the local machinein visual vm: add new remote connection, and specify remote as host and the port for jstatd (1099 for default, or what you specified with -p when running jstatd)
You should now see the processes on the remote side in visualvm
I found that in the jvm arguments for the proxy do not work. At least in version 1.3.3 (build 111013). Setting the proxy in Tools > Options > Network worked for me. Also system wide proxy settings should work though by definition it affects all other network connections.
Try a different version of jvisualvm (e.g. the newest from https://visualvm.github.io/download.html)
I couldn't make it work with jvisualvm, as it didn't use the SOCKS proxy (I didn't see anything related to jvisualvm in ssh -v -D 9696). Remote applications never appeared in jvisualvm. VisualVM however showed them after some seconds.
I also found that the jvm arguments:
did not work on the build i am using 1.3.2.
Therefore I used the Tools > Options > Network and set it manually under the SOCKS settings.
BUT VisualVM did did still not find the remote processes. I then removed the "No proxy hosts" listening of localhost, since this probably blocked it.