使用 VisualVM 进行性能分析及调优

开发工具: IntelliJ IDEA2019.2

本机jdk版本:1.8.0_131

JVM调优诊断工具:VisualVM1.4.3,下载地址:https://visualvm.github.io/

VisualVM下载完后,需要额外下载2个插件,根据自己的jdk版本在,https://visualvm.github.io/pluginscenters.html中下载

Visual GC  和 MBeans

打卡VisualVM,tools --->plugins---->Downloaded     install一下,安装完后如图。

配置idea与VisualVM的关联:

后启动springboot项目,点这个按钮

VisualVM自起后界面如图:

 

graphs栏说明:

阶段耗时GC次数
编译27.851s/
类加载16.29s/
垃圾回收5.665s273
Eden区回收26.776s271
老年代回收1.855s2

功能介绍

下面我们将介绍性能分析的几种常见方式以及如何使用 VisualVM 性能分析工具进行分析。

内存分析

VisualVM 通过检测 JVM 中加载的类和对象信息等帮助我们分析内存使用情况,我们可以通过 VisualVM 的监视标签和 Profiler 标签对应用程序进行内存分析。

在监视标签内,我们可以看到实时的应用程序内存堆以及永久保留区域的使用情况。

图 3. 内存堆使用情况

图 3. 内存堆使用情况

图 4. 永久保留区域使用情况

图 4. 永久保留区域使用情况

此外,我们也可以通过 Applications 窗口右击应用程序节点来启用“在出现 OOME 时生成堆 Dump”功能,当应用程序出现 OutOfMemory 例外时,VisualVM 将自动生成一个堆转储。

图 5. 开启“在出现 OOME 时生成堆”功能

图 5. 开启“在出现 OOME 时生成堆”功能

在 Profiler 标签,点击“内存”按钮将启动一个内存分析会话,等 VisualVM 收集和统计完相关性能数据信息,将会显示在性能分析结果。通过内存性能分析结果,我们可以查看哪些对象占用了较多的内存,存活的时间比较长等,以便做进一步的优化。

此外,我们可以通过性能分析结果下方的类名过滤器对分析结果进行过滤。

图 6. 内存分析结果

图 6. 内存分析结果

CPU 分析

VisualVM 能够监控应用程序在一段时间的 CPU 的使用情况,显示 CPU 的使用率、方法的执行效率和频率等相关数据帮助我们发现应用程序的性能瓶颈。我们可以通过 VisualVM 的监视标签和 Profiler 标签对应用程序进行 CPU 性能分析。

在监视标签内,我们可以查看 CPU 的使用率以及垃圾回收活动对性能的影响。过高的 CPU 使用率可能是由于我们的项目中存在低效的代码,可以通过 Profiler 标签的 CPU 性能分析功能进行详细的分析。如果垃圾回收活动过于频繁,占用了较高的 CPU 资源,可能是由内存不足或者是新生代和旧生代分配不合理导致的等。

图 7. CPU 使用情况

图 7. CPU 使用情况

在 Profiler 标签,点击“CPU”按钮启动一个 CPU 性能分析会话 ,VisualVM 会检测应用程序所有的被调用的方法。当进入一个方法时,线程会发出一个“method entry”的事件,当退出方法时同样会发出一个“method exit”的事件,这些事件都包含了时间戳。然后 VisualVM 会把每个被调用方法的总的执行时间和调用的次数按照运行时长展示出来。

此外,我们也可以通过性能分析结果下方的方法名过滤器对分析结果进行过滤。

图 8. CPU 性能分析结果

图 8. CPU 性能分析结果

线程分析

Java 语言能够很好的实现多线程应用程序。当我们对一个多线程应用程序进行调试或者开发后期做性能调优的时候,往往需要了解当前程序中所有线程的运行状态,是否有死锁、热锁等情况的发生,从而分析系统可能存在的问题。

在 VisualVM 的监视标签内,我们可以查看当前应用程序中所有活动线程和守护线程的数量等实时信息。

图 9. 活跃线程情况

图 9. 活跃线程情况

VisualVM 的线程标签提供了三种视图,默认会以时间线的方式展现。另外两种视图分别是表视图和详细信息视图。

时间线视图上方的工具栏提供了缩小,放大和自适应三个按钮,以及一个下拉框,我们可以选择将所有线程、活动线程或者完成的线程显示在视图中。

图 10. 线程时间线视图

图 10. 线程时间线视图

图 11. 线程表视图

图 11. 线程表视图

我们在详细信息视图中不但可以查看所有线程、活动线程和结束的线程的详细数据,而且也可以查看某个线程的详细情况。

图 12. 线程详细视图

图 12. 线程详细视图

快照功能

我们可以使用 VisualVM 的快照功能生成任意个性能分析快照并保存到本地来辅助我们进行性能分析。快照为捕获应用程序性能分析数据提供了一个很便捷的方式因为快照一旦生成可以在任何时候离线打开和查看,也可以相互传阅。

VisualVM 提供了两种类型的快照:

  • Profiler 快照:当有一个性能分析会话(内存或者 CPU)正在进行时,我们可以通过性能分析结果工具栏的“快照”按钮生成 Profiler 快照捕获当时的性能分析数据。

图 13. Profiler 快照

图 13. Profiler 快照

  • 应用程序快照:我们可以右键点击左侧 Applications 窗口中应用程序节点,选择“应用程序快照”为生成一个应用程序快照。应用程序快照会收集某一时刻的堆转储,线程转储和 Profiler 快照,同时也会捕获 JVM 的一些基本信息。

图 14. 应用程序快照

图 14. 应用程序快照

转储功能

线程转储的生成与分析

VisualVM 能够对正在运行的本地应用程序生成线程转储,把活动线程的堆栈踪迹打印出来,帮助我们有效了解线程运行的情况,诊断死锁、应用程序瘫痪等问题。

图 15. 线程标签及线程转储功能

图 15. 线程标签及线程转储功能

当 VisualVM 统计完应用程序内线程的相关数据,会把这些信息显示新的线程转储标签。

图 16. 线程转储结果

图 16. 线程转储结果

堆转储的生成与分析

VisualVM 能够生成堆转储,统计某一特定时刻 JVM 中的对象信息,帮助我们分析对象的引用关系、是否有内存泄漏情况的发生等。

图 17. 监视标签及堆转储功能

图 17. 监视标签及堆转储功能

当 VisualVM 统计完堆内对象数据后,会把堆转储信息显示在新的堆转储标签内,我们可以看到摘要、类、实例数等信息以及通过 OQL 控制台执行查询语句功能。

堆转储的摘要包括转储的文件大小、路径等基本信息,运行的系统环境信息,也可以显示所有的线程信息。

图 18. 堆转储的摘要视图

图 18. 堆转储的摘要视图

从类视图可以获得各个类的实例数和占用堆大小数,分析出内存空间的使用情况,找出内存的瓶颈,避免内存的过度使用。

图 19. 堆转储的类视图

图 19. 堆转储的类视图

通过实例数视图可以获得每个实例内部各成员变量的值以及该实例被引用的位置。首先需要在类视图选择需要查看实例的类。

图 20. 选择查询实例数的类

图 20. 选择查询实例数的类

图 21. 实例数视图

图 21. 实例数视图

此外,还能对两个堆转储文件进行比较。通过比较我们能够分析出两个时间点哪些对象被大量创建或销毁。

图 22. 堆转储的比较

图 22. 堆转储的比较

图 23. 堆转储的比较结果

图 23. 堆转储的比较结果

线程转储和堆转储均可以另存成文件,以便进行离线分析。

图 24. 转储文件的导出

图 24. 转储文件的导出

总结

本文首先简要列举了一些性能分析相关的背景知识。然后介绍了 VisualVM 的下载和安装。最后从内存性能、CPU 性能、快照功能以及转储功能四个方面展开,进一步说明了如何使用 VisualVM 进行性能分析。通过本文的介绍,相信读者对性能分析会有一定的了解,并可以利用 VisualVM 进行性能分析

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值