Prepare application on remote server
jstatd needs some security settings explained in [1]. Open vim, enter
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
and save as jstatd.all.policy.
Now start jstatd in the same directory, let in run in the background:
jstatd -J-Djava.security.policy=jstatd.all.policy &
Next, start the app (assuming $MY_APP is the main class) as described in [2]:
java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=$JMX_PORT \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=$EXTERNAL_IP \
$MY_APP
$JMX_PORT can be any available TCP port. $EXTERNAL_IP is the server's external IP address.
Make sure that the server's firewall allows incoming connections on both TCP 1099 (jstatd) and the port you chose as $JMX_PORT.
Connect VisualVM
Start VisualVM, double click on remote. Enter the server's external IP address:
Right-click on the new connection and add a JMX connection:
Enter $EXTERNAL_IP:$JMX_PORT from above, in my case 192.168.0.160:
This should add a connection to the running app:
Double-click on it, start profiling, enjoy.