概述

本文将介绍如何使用VisualVM和Java Management Extensions (JMX) 远程监控Java应用程序。

2. JMX

JMX 是 一种标准API,用于管理与监控JVM应用。JVM内置了JMX可以利用的监控工具。因此,我们通常称这些工具为“开箱即用的管理工具”,或者在这种情况下,称为“JMX代理”。

3. VisualVM

VisualVM 是一个提供轻量级JVM性能分析功能的可视工具。市面上还有很多主流的性能分析器。然而,VisualVM是免费的,并且在JDK 6U7及早期更新版本中作为JDK的一部分提供。对于其他版本,Java VisualVM 可以作为独立的应用程序获取。

VisualVM 允许我们连接到本地和远程的JVM应用程序进行监控

当在任何机器上启动时,它会自动发现并开始监控所有本地运行的JVM应用程序。然而,我们需要明确地连接到远程应用程序。

3.1. JVM连接模式

JVM通过工具如*jstatd* 或 JMX 提供自我监控的接口。这些工具反过来又为像VisualVM这样的工具提供了获取性能数据的API。

jstatd 程序是JDK附带的守护进程,但其功能有限。例如,我们无法监控CPU使用率,也无法生成线程快照。

另一方面,JMX技术不需要在JVM上运行任何守护进程。此外,它可以用来监控本地和远程的JVM应用程序。然而,我们需要以特殊方式启动JVM来启用开箱即用的监控功能。在这篇文章中,我们将重点放在JMX模式上。

3.2. 启动

正如我们之前看到的,我们的JDK版本可能包含VisualVM,也可能不包含。无论哪种情况,我们都可以通过执行适当的二进制文件来启动它:

./jvisualvm

如果该二进制文件位于$JAVA_HOME/bin文件夹中,上述命令将打开VisualVM界面,如果单独安装,它可能会位于不同的文件夹中。

VisualVM默认会启动并加载所有本地运行的Java应用程序:

VisualVM启动

3.3. 功能

VisualVM提供了许多有用的功能:

  • 展示本地和远程Java应用程序进程
  • 以CPU使用率、垃圾回收活动、已加载类数量等指标监控进程性能
  • 可视化所有进程中的线程及其在不同状态(如睡眠和等待)下的时间
  • 生成和显示线程快照,立即深入了解被监控进程的状态

VisualVM功能页面链接列出了更全面的可用功能。像所有精心设计的软件一样,VisualVM可以通过安装第三方插件扩展,以访问更高级和独特的功能。

4. 远程监控

在本节中,我们将演示如何使用VisualVM和JMX远程监控Java应用程序。我们还将有机会探索所有必要的配置和JVM启动选项。

4.1. 应用程序配置

我们通常通过启动脚本启动大部分或全部Java应用程序,该脚本通常向JVM传递应用程序所需的参数,如最大和最小内存需求。

假设我们有一个打包为MyApp.jar的应用程序,让我们看看一个包含主要JMX配置参数的启动命令示例:

java -Dcom.sun.management.jmxremote.port=8080 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Xms1024m -Xmx1024m -jar MyApp.jar

在上述命令中,MyApp.jar 通过8080端口启用了开箱即用的监控功能,并且为了简化,我们禁用了SSL加密和密码验证。

在生产环境中,理想情况下,当在公共网络中时,我们应该确保VisualVM和JVM应用之间的通信得到保护。

4.2. VisualVM配置

现在我们已经本地运行了VisualVM,并且远程服务器上的MyApp.jar 正在运行,我们可以开始我们的远程监控会话。

在左侧面板上右键单击,然后选择添加JMX连接

VisualVM JMX连接

在弹出对话框的“连接”字段中输入主机:端口组合,然后点击确定

如果成功,现在我们可以通过从左侧面板双击新连接来查看监控窗口:

VisualVM远程监控

5. 总结

本文介绍了如何使用VisualVM和JMX进行Java应用程序的远程监控。