
版权声明:本文的内容源自于「IBM Developer」的博文,以对原文做重大更新,并新增 JProfiler 的内容。
在我们开发大型 Java 应用程序的过程中,难免遇到内存泄露、性能瓶颈等问题,比如文件、网络、数据库的连接未释放,未优化的算法等。随着应用程序的持续运行,可能会造成整个系统运行效率下降,严重的则会造成系统崩溃。为了找出程序中隐藏的这些问题,在项目开发后期往往会使用性能分析工具来对应用程序的性能进行分析和优化。在本文中,我们主要介绍 VisualVM 和 JProfiler 这两款性能分析工具。
windbg和 Linux 上的gdb等。VisualVM 是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。
由于 VisualVM 已经被 Oracle 在 GitHub 上开源了,因此我们可以直接在 GitHub 上下载安装包。
进入visualvm的项目首页后,点击releases选项:

如上图所示,点击releases之后,我们可以看到visualvm的所有稳定发布版:

如上图所示,VisualVM 已经更新至 2.0.2 版本,我们可以选择自己想要安装的版本,点击下载之后,自行安装即可。

如上图所示,以 Mac 为例,演示 VisualVM 2.0 版本的使用:

如上图所示,打开 VisualVM 之后,进入如上界面。在这里,我们主要关注Local和Remote,其中:
Local,监控本地进程;Remote,监控远程进程。默认情况下,启动 VisualVM 之后,就会自动监控本地的 Java 进程。但是,如果我们想要监控远程的 Java 进程,则需要进行配置。右键点击Remote,选择Add Remote Host,进入如下页面:

如上图所示,在Host name框中输入我们想要监控的远程主机的 IP,如172.12.21.234;至于Display name,我们可以理解为别名或者昵称,自定义即可,完成后,点击OK按钮:

如上图所示,连接到指定的主机之后,我们还需要指定想要监控的端口。右键点击已连接的主机,选择Add JMX Connection,新增 Java 管理扩展连接,进入如下页面:

如上图所示,在Connection中默认会回显主机 IP,我们只需要输入想要监控的端口即可,在这里,我们指定端口为25600,输入完成后,点击OK按钮:

如上图所示,VisualVM 已经连接到我们指定的主机以及端口。其中,在上图的右侧部分,已经显示了进程的部分信息,如 PID、Host、Main class、Java 版本和 JVM 启动参数等。但是在这里,我们需要特别注意一点,那就是:我们输入的25600端口并不是随便输入的,而是需要我们事先在启动脚本或者启动参数中配置的。具体的配置示例,如下:
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=25600 \现在,我们已经监控到指定的进程了。接下来,我们一起来看看如何查看更为详细的监控信息。首先,我们右键点击已经连接的服务:

如上图所示,右键菜单中展示了 Open、Sample、Thread Dump 和 Head Dump 等功能,其中:
Thread Dump,获取线程转储;Head Dump,获取堆转储;Application Snapshot,获取应用运行状态快照。在这里,以Application Snapshot为例,点击之后,VisualVM 会生成一个应用当前运行状态的快照,并将其存储到Snapshats一栏,如上图左侧红色方框标记所示。点击生成的快照之后,会在右侧会显示快照信息。同样,点击Thread Dump和Head Dump之后,会生成对应的线程转储和堆转储,只不过存储的位置会略有不同。

如上图所示,我们看 VisualVM 的右侧页面,包括 Overview、Monitor、Threads、Sampler 和 Visual GC 等,其中:
Overview,进程信息概览,包括 JDK 版本、JVM 启动参数和环境变量配置等信息;Monitor,图形化监控页面,包括 CPU、内存、类以及线程等信息,可以手动触发 GC 以及执行堆转储;Threads,线程信息,可以查询进程内线程活动情况,可以执行线程转储;Sampler,采样器,可以实时采集 CPU、内存等信息;Visual GC,监控垃圾收集情况,想要使用此功能需要我们事前在启动脚本或者启动命令中进行配置。上图就是 Overview 页面的内容。接下来,我们再来看看 Monitor、Threads 以及 Sampler 的页面。

如上图所示,就是 Monitor 页面的内容,包括 CPU、Memory、Classes 和 Threads,其中:
CPU,实时显示 CPU 使用率以及 GC 活动比例;Memory,实时显示堆使用情况,包括Metaspace,JDK 8 之前是PermGen;Classes,实时显示类加载情况;Threads,实时显示线程的数量,包括总线程数量以及守护线程数量。在这里,我们可以通过勾选上面的选择框自定义显示样式,像上面就仅勾选了CPU和Threads。

如上图所示,勾选了CPU、Memory、Classes和Threads四个选项。同时,我们也可以点击Perform GC按钮,手动触发 GC;点击Heap Dump按钮,可以导出堆转储信息。

如上图所示,就是 Threads 页面的内容,显示了线程的活跃情况。同时,点击Thread Dump,可以导出线程转储信息

如上图所示,就是 Sampler 页面的内容,可以采集 CPU 和内存的信息。当我们点击CPU或者Memory按钮之后,开始执行采样,点击Stop即可结束采样。上图为 CPU 采样的结果,显示了各个线程占用 CPU 的情况;点击Memory,可以切换到内存的采样结果:

如上图所示,就是内存的采样结果,显示各个类型对象占用的内存情况。
同样,在 Sampler 页面,我们也可以找到手动触发 GC、导出堆转储以及线程转储的按钮。
JProfiler 是由 EJ 技术有限公司针对 Java 应用程序开发的性能监控工具,可以对 JVM 进行精确的监控,其中堆遍历、CPU 剖析、线程剖析是定位当前系统瓶颈的有效手段。与 Oracle 开源的 VisuaVM 相比,JProfiler 的功能更为强大,但 JProfiler 却是一个重量级的 JVM 监控工具,当启动 JProfiler 监控的时候,会使得 CPU 的使用率显著飙升。
首先,进入 EJ 官方的 JProfiler 下载地址:
点击上述链接后,进入如下页面:

如上图所示,自行选择需要安装的版本,然后点击DOWNLAOD按钮,下载 JProfiler 安装包。
特别地,JProfiler 需要激活使用,至于激活的方法,网上有很多,大家自己搜索即可。
Em…,网上有很多,我就先不写了,直接给出一些链接,大家跳过去参考下吧,捂脸!
如上述链接所示,这是我感觉写的很不错的两篇文章,在此分享给大家。
参考资料: