In this article, we'll learn how to use VisualVM and Java Management Extensions (JMX) for remote monitoring of Java applications.
JMX is a standard API for the management and monitoring of JVM applications. The JVM has built-in instrumentation that JMX can use for this purpose. As a result, we usually call these utilities “out-of-the-box management tools” or, in this case, “JMX agents”.
VisualVM is a visual tool that provides lightweight profiling capabilities for the JVM. There are plenty of other mainstream profiling tools. However, VisualVM is free and comes bundled with the JDK 6U7 release until early updates of JDK 8. For other versions, Java VisualVM is available as a standalone application.
VisualVM allows us to connect to both local and remote JVM applications for monitoring purposes.
When launched on any machine, it auto-discovers and starts monitoring all JVM applications running locally. However, we need to connect remote applications explicitly.
3.1. JVM Connection Modes
The jstatd program is a daemon that's bundled with the JDK. However, it has limited capability. For instance, we can't monitor CPU usage, nor can we take thread dumps.
On the other hand, JMX technology doesn't require any daemon to run on the JVM. Moreover, it can be used to profile both local and remote JVM applications. However, we do need to start the JVM with special properties to enable the out-of-the-box monitoring features. In this article, we'll only focus on the JMX mode.
As we saw earlier, our JDK version can either come bundled with VisualVM or not. In either case, we can launch it by executing the appropriate binary:
If the binary is present in the $JAVA_HOME/bin folder, then the above command will open the VisualVM interface, and it could be in a different folder if installed separately.
VisualVM will launch and load all the Java applications running locally by default:
VisualVM provides several useful features:
- Display of local and remote Java application processes
- Monitoring process performance in terms of CPU usage, GC activity, number of loaded classes, and other metrics
- Visualizing threads in all processes and the times they spend in different states such as sleeping and waiting
- Taking and displaying thread dumps for immediate insights into what is going on in the processes being monitored
The VisualVM features page has a more comprehensive list of available features. Like all well-designed software, VisualVM can be extended to access more advanced and unique features by installing third-party plugins available on the Plugins tab.
4. Remote Monitoring
In this section, we'll demonstrate how to monitor a Java application using VisualVM and JMX remotely. We'll also get a chance to explore all the necessary configurations and JVM startup options.
4.1. Application Configuration
We launch most, if not all, Java applications with a startup script. In this script, the start command usually passes essential parameters to the JVM to specify the application's needs, such as maximum and minimum memory requirements.
Assuming we have an application packaged as MyApp.jar, let's see an example startup command that includes the main JMX configuration parameters:
java -Dcom.sun.management.jmxremote.port=8080 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms1024m -Xmx1024m -jar MyApp.jar
In the command above, MyApp.jar is launched with out-of-the-box monitoring capability configured via port 8080. Furthermore, we deactivated SSL encryption and password authentication for simplicity.
In a production setting, we should, ideally, secure communication between VisualVM and the JVM application when in a public network.
4.2. VisualVM Configuration
Now that we have VisualVM running locally and our MyApp.jar running on a remote server, we can begin our remote monitoring session.
Right-click on the left panel and select Add JMX Connection:
Input the host:port combination in the Connection field in the resulting dialog box and click OK.
If successful, we should now be able to see a monitoring window by double-clicking the new connection from the left panel:
In this article, we've explored remote monitoring of Java applications with VisualVM and JMX.