Java应用程序难免遇到性能问题,例如常见的OutOfMemmoryError,又或者是出现内存泄漏的错误,又或是程序运行一段时间就卡死了,CPU或者内存占用率高,甚至造成系统崩溃,等等。出现性能问题时,往往难以分析和跟踪。不过,可以借助于一些性能分析工具,来监测程序性能,从而找出影响性能的问题所在,以便进行优化。本文的VisualVM就是一款比较强大的性能分析工具。

先来看看性能分析的几种方式:

性能分析的主要方式

性能分析常用的有以下几种方式 * 监视:监视是一种用来查看应用程序运行时行为的一般方法。通常会有多个视图(View)分别实时地显示 CPU 使用情况、内存使用情况、线程状态以及其他一些有用的信息,以便用户能很快地发现问题的关键所在。 * 转储(dump):性能分析工具从内存中获得当前状态数据并存储到文件用于静态的性能分析。Java 程序是通过在启动 Java 程序时添加适当的条件参数来触发转储操作的。它包括以下三种: 核心dump:JVM 生成的本地系统的转储。一般的,系统转储数据量大,需要平台相关的工具去分析,如 Windows 上的 windbg 和 Linux 上的 gdb。 Jvm dump:JVM 内部生成的格式化后的数据,包括线程信息,类的加载信息以及堆的统计数据。通常也用于检测死锁。 堆dump:JVM 将所有对象的堆内容存储到文件。 * 快照:应用程序启动后,性能分析工具开始收集各种运行时数据,其中一些数据直接显示在监视视图中,而另外大部分数据被保存在内部,直到用户要求获取快照,基于这些保存的数据的统计信息才被显示出来。快照包含了应用程序在一段时间内的执行信息,通常有 CPU 快照和内存快照两种类型。 CPU 快照:主要包含了应用程序中函数的调用关系及运行时间,这些信息通常可以在 CPU 快照视图中进行查看。 内存快照:主要包含了内存的分配和使用情况、载入的所有类、存在的对象信息及对象间的引用关系等。这些信息通常可以在内存快照视图中进行查看。 * 性能分析:性能分析是通过收集程序运行时的执行数据来帮助开发人员定位程序需要被优化的部分,从而提高程序的运行速度或是内存使用效率,主要有以下三个方面: CPU 性能分析:CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。通常有 CPU 监视和 CPU 快照两种方式来显示 CPU 性能分析结果。 内存性能分析:内存性能分析的主要目的是通过统计内存使用情况检测可能存在的内存泄露问题及确定优化内存使用的方向。通常有内存监视和内存快照两种方式来显示内存性能分析结果。 线程性能分析:线程性能分析主要用于在多线程应用程序中确定内存的问题所在。一般包括线程的状态变化情况,死锁情况和某个线程在线程生命期内状态的分布情况等

— 使用 VisualVM 进行性能分析及调优
https://www.ibm.com/developerworks/cn/java/j-lo-visualvm

1. VisualVM简介

cbdb6d636de24970b3b7269022d33b08

VisualVM是集成JDK命令行工具和轻量级分析功能的可视化分析工具,设计用于开发和生产时间的使用。它提供了一个可视化界面,用于查看基于Java技术、运行于JVM上的应用程序(Java应用程序)的详细信息。

VisualVM组织Java开发工具包(JDK)工具检索的JVM软件的数据,并以一种使您能够快速查看多个Java应用程序的数据的方式提供信息。您可以查看在远程主机上运行的本地应用程序和应用程序的数据。您还可以捕获有关JVM软件实例的数据,并将数据保存到您的本地系统中,以供后期查看或与其他用户共享。

VisualVM完全免费,它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。

2. VisualVM安装

从JDK6开始,VisualVM已经成为JDK自带工具,名称叫做jvisualvm,位于%JAVA_HOME%/bin/jvisualvm.exe,执行即可启动。

需要注意的是,从Oracle JDK 9开始,Java VisualVM迁移到GraalVM,这是在Oracle实验室开发的一种创新的、高性能的多语言虚拟机。详情请参阅 Graal VisualVM页面

06d6784b19c140a2bf6e9c6ba06bc93b

可以从 官网下载独立的版本,下载完成解压目录即可使用,执行bin目录下的visualvm.exe即可启动。

为了能充分利用所有的 Java VisualVM 功能,应该至少使用JDK6版本。

3. VisualVM启动

执行%JAVA_HOME%/bin/jvisualvm.exe,即可启动,主界面:

e5b88b570090444782d770253da4d3af

首次启动后,在应用程序窗口的本地菜单中,会显示当前本地运行的java程序。程序主界面分为几个区域:菜单栏、工具栏、应用程序窗口(左侧)、主窗口(右侧)和状态栏(底部),同大多的windows桌面应用类似,就不详细介绍了。

4. 应用程序窗口

“应用程序”窗口是查看特定应用程序详细信息的主入口点,用于快速浏览本地或者远程运行的java程序,一共有四个节点:本地、远程、VM核心dump和快照。右键单击应用程序节点将打开弹出式菜单,从该弹出式菜单中可以选择是打开主应用程序标签,还是生成线程dump或堆dump。

4.1. 本地

本地节点下,显示了本地运行的java程序的名称和进程id(pid),并且会实时显示java程序,当java程序启动或退出时,本地节点下会自动显示或删除应用。

右键点击想要监测的应用,会弹出功能菜单,里边包括了打开程序监测主窗口,CPU和内存抽样监测,线程Dump,堆dump,程序快照等多个菜单功能。

2be7ac5476ba455abcabb379c2b54ccc

4.2. 远程

本地节点自动展示了本地运行的java程序,而远程节点用于展示远程服务器上运行的java程序。同本地节点不同,你需要自己添加远程主机:

56a4f05da8aa4b3e85b91163236fc1fb

输入能够访问的主机ip地址或名称,然后确定。添加完成后,会自动展示该主机上能够被监测的运用程序的端口和进程id。远程主机的信息会被保存在本地,当visualvm启动时,会自动连接到远程主机上。如果你不想再监测远程主机,右键删除即可。

同本地节点一样,添加远程主机连接也有两种方式:jmx连接和jstatd连接,后续我们再做具体介绍。

21786ffc5f22415aad881dfe0e432f15

4.3. VM核心dump

可以打开VM核心dump文件,并进行分析。核心dump是一个二进制文件,它包含了进行核心dump时机器运行时状态的信息,通过核心dump,可以提取系统属性、堆转储和线程转储。

该节点仅在VisualVM运行于Solaris或Linux上才会显示。

d4a48cb598514afa81c55c0e9c5d661b

4.4. 快照

快照节点展示了通过VisualVM捕获的存储于VisualVM用户目录的本地或者远程应用程序的快照信息,同时,还可以打开存储的快照apps文件。

应用程序快照,是应用程序某一个时刻的数据捕获的视图,例如收集的堆dump、线程dump和分析器数据。创建快照后,可以将当时程序的信息进行存储,以后后来进行分析或者共享给他人。

您可以展开应用程序快照节点,以查看快照中收集的数据。

37de82fc314b41379ca861bee87ed10d

5. 插件安装

  1. 从主菜单中选择“工具”>“插件”。

  2. 在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。

  3. 逐步完成插件安装程序。

f34b7aa6416c4f35880a7f3655d15683

6. 总结

本文介绍了VisualVM工具的基本信息,包括介绍、安装、启动、应用程序窗口以及插件的安装等。在对工具有一定认识后,接下来,我们来看如何使用VisualVM进行性能监控。


相关阅读