VisualVM最新版是一款专业实用的集成了多个jdk命令行的可视化工具,一般都用来对Java应用程序做性能分析和调优,功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和
CPU 分析,同时VisualVM还支持在 MBeans 上进行浏览和操作!
VisualVM功能介绍
一、性能分析的主要方式
1.监视:监视是一种用来查看应用程序运行时行为的一般方法。通常会有多个视图(View)分别实时地显示 CPU
使用情况、内存使用情况、线程状态以及其他一些有用的信息,以便用户能很快地发现问题的关键所在。
2.转储:性能分析工具从内存中获得当前状态数据并存储到文件用于静态的性能分析。Java 程序是通过在启动 Java
程序时添加适当的条件参数来触发转储操作的。它包括以下三种:
系统转储:JVM 生成的本地系统的转储,又称作核心转储。一般的,系统转储数据量大,需要平台相关的工具去分析,如 Windows 上的 windbg 和
Linux 上的 gdb.
Java 转储:JVM 内部生成的格式化后的数据,包括线程信息,类的加载信息以及堆的统计数据。通常也用于检测死锁。
堆转储:JVM 将所有对象的堆内容存储到文件。
二、快照:
应用程序启动后,性能分析工具开始收集各种运行时数据,其中一些数据直接显示在监视视图中,而另外大部分数据被保存在内部,直到用户要求获取快照,基于这些保存的数据的统计信息才被显示出来。快照包含了应用程序在一段时间内的执行信息,通常有
CPU 快照和内存快照两种类型。
CPU 快照:主要包含了应用程序中函数的调用关系及运行时间,这些信息通常可以在 CPU 快照视图中进行查看。
内存快照:主要包含了内存的分配和使用情况、载入的所有类、存在的对象信息及对象间的引用关系等。这些信息通常可以在内存快照视图中进行查看。
三、性能分析:
性能分析是通过收集程序运行时的执行数据来帮助开发人员定位程序需要被优化的部分,从而提高程序的运行速度或是内存使用效率,主要有以下三个方面:
CPU 性能分析:CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。通常有 CPU
监视和 CPU 快照两种方式来显示 CPU 性能分析结果。
内存性能分析:内存性能分析的主要目的是通过统计内存使用情况检测可能存在的内存泄露问题及确定优化内存使用的方向。通常有内存监视和内存快照两种方式来显示内存性能分析结果。
线程性能分析:线程性能分析主要用于在多线程应用程序中确定内存的问题所在。一般包括线程的状态变化情况,死锁情况和某个线程在线程生命期内状态的分布情况等
VisualVM软件特色
1、内存分析
VisualVM 通过检测 JVM 中加载的类和对象信息等帮助我们分析内存使用情况,我们可以通过 VisualVM 的监视标签和 Profiler
标签对应用程序进行内存分析。
2、CPU 分析
VisualVM 能够监控应用程序在一段时间的 CPU 的使用情况,显示 CPU
的使用率、方法的执行效率和频率等相关数据帮助我们发现应用程序的性能瓶颈。我们可以通过 VisualVM 的监视标签和 Profiler 标签对应用程序进行
CPU 性能分析。
3、线程分析
Java
语言能够很好的实现多线程应用程序。当我们对一个多线程应用程序进行调试或者开发后期做性能调优的时候,往往需要了解当前程序中所有线程的运行状态,是否有死锁、热锁等情况的发生,从而分析系统可能存在的问题。
4、快照分析
我们可以使用 VisualVM
的快照功能生成任意个性能分析快照并保存到本地来辅助我们进行性能分析。快照为捕获应用程序性能分析数据提供了一个很便捷的方式因为快照一旦生成可以在任何时候离线打开和查看,也可以相互传阅。
VisualVM 提供了两种类型的快照:
Profiler 快照:当有一个性能分析会话(内存或者 CPU)正在进行时,我们可以通过性能分析结果工具栏的“快照”按钮生成 Profiler
快照捕获当时的性能分析数据。
应用程序快照:我们可以右键点击左侧 Applications
窗口中应用程序节点,选择“应用程序快照”为生成一个应用程序快照。应用程序快照会收集某一时刻的堆转储,线程转储和 Profiler 快照,同时也会捕获 JVM
的一些基本信息。
5、转储功能
线程转储的生成与分析:VisualVM
能够对正在运行的本地应用程序生成线程转储,把活动线程的堆栈踪迹打印出来,帮助我们有效了解线程运行的情况,诊断死锁、应用程序瘫痪等问题。
堆转储的生成与分析:VisualVM 能够生成堆转储,统计某一特定时刻 JVM
中的对象信息,帮助我们分析对象的引用关系、是否有内存泄漏情况的发生等。
VisualVM安装步骤
VisualVM 是一个性能分析工具,自从 JDK 6 Update 7 以后已经作为 Oracle JDK 的一部分,位于 JDK 根目录的 bin
文件夹下。VisualVM 自身要在 JDK6 以上的版本上运行,但是它能够监控 JDK1.4 以上版本的应用程序。下面主要介绍如何安装 VisualVM
以及各种 VisualVM 上的插件。
一、安装VisualVM
1、将 VisualVM 安装程序解压缩到本地系统。
2、导航至 VisualVM 安装目录的 bin 目录,然后启动 jvisualvm.exe。
二、安装 VisualVM 上的插件
VisualVM 插件中心提供很多插件以供安装向 VisualVM 添加功能。可以通过 VisualVM 应用程序安装,或者从 VisualVM
插件中心手动下载插件,然后离线安装。另外,用户还可以通过下载插件分发文件 (.nbm 文件 ) 安装第三方插件为 VisualVM 添加功能。
1、VisualVM 插件中心安装插件安装步骤 :
从主菜单中选择“工具”>“插件”。
在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。
逐步完成插件安装程序。
2、从主菜单中选择“工具”>“插件”。
在“已下载”标签中,点击"添加插件"按钮,选择已下载的插件分发文件 (.nbm) 并打开。
选中打开的插件分发文件,并单击"安装"按钮,逐步完成插件安装程序。
VisualVM常见问题
依赖缺失
问题描述:新手在尝试构建VisualVM项目时,可能会遇到依赖缺失的问题,例如缺少Apache Ant或Oracle JDK。
解决方案:
确保已安装Apache Ant 1.9.15或更高版本,可以从Apache Ant官网下载并安装。
确保已安装Oracle JDK 8,可以从Oracle官网下载并安装。
将Ant和JDK的安装路径添加到系统的环境变量中,确保命令行工具可以识别这些路径。
VisualVM更新日志
变化
功能和改进。
GH-260: 完全支持在JDK 16上运行并监控/描述Java 16进程
GH-262: 增加对苹果M1的支持
GH-270: 从以前的VisualVM版本导入插件
GH-275: 增加关于启用模块的信息
GH-279: 增加保留尺寸计算的部分进度
GH-254: 更新器的品牌效应。
Python的堆栈跟踪
HeapViewer - 逻辑值增加了Instant, Attributes$Name, FDBigInteger,
java.lang.module
HeapViewer - java.util类的逻辑值--集合现在显示元素的数量
Gradle的应用识别器
更新了JDK工具的应用识别器
API变更。
GH-282: 在org.graalvm.visualvm.lib.jfluid.heap包的公共API中添加泛型。
GH-283: 增加了从实例中获取Heap的方法。
修复了Bug。
GH-127: G1GC的最大堆不正确
GH-257: "打开快照失败。"由于没有完全读取压缩数据
GH-263: 保留的大小计算为负数
GH-268: 检测VisualVM是否在Eclipse OpenJ9上运行
GH-272: 计算引用时没有进度条
GH-273: NPE:无法调用 "java.lang.management.MemoryMXBean.gc()"
GH-274: 逻辑值:'...'被添加到完整的字符串中
GH-276: 缺少已知的阻塞方法
GH-277: 不正确的水平滚动
GH-278:LongBuffer.startReading()处的NPE。
GH-280: 在MacOS上选择背景颜色不正确
HeapViewer--PythonModule、SourceImpl$Key、InetSocketAddress、BigDecimal的逻辑值固定。
内存采样器--改进了重载下的刷新功能
改进了对IntelliJ应用程序的检测
华军小编推荐:
VisualVM这款软件完全傻瓜式操作,超级简单,另外小编还推荐JUDE、jarfix、谷歌浏览器等相关软件下载使用。