死磕P7:JVM性能调优(二)

p7   jvm   java   VisualVM  
发布于 Sep 29, 2024

这是「死磕P7」系列第 008 篇文章,欢迎大家来跟我一起 死磕 100 天,争取在 2025 年来临之际,给自己一个交代。

接上篇,性能优化工具,尤其是图形化工具,绝对有 VisualVM 的一席之地,因为它几乎囊括了其他 JDK 工具的所有功能。

我们学习性能优化可不仅仅是为了应付面试,背一些八股文(当然,大部分情况是有用的,只是不可长久),我们需要真正掌握一门技能,对自己有一个交代。

VisualVM 是 JDK 自带的性能调优工具之一,通过它可以看到本地或者远程程序运行的情况,非常实用,今天我们就来学习一下它的使用吧。

$JAVA_HOME/bin 路径下有一个可执行程序 jvisualvm.exe , 没错,就是它了,双击打开它!

打开后的界面如图(Java 便写的图形界面):

在打开的界面中,左边是应用程序列表,分为本地和远程,只要你本地有java进程启动,他就会自动检测到,如我本地启动了 idea 和 visualvm ,第三个是激活 jetbrains 的工具。

我们再来随便启动一个小型的 springboot 项目看看,DemoApplication 就是我通过 idea 打开的一个只有一个 API 接口的 springboot 项目。

双击 DemoApplication 进程,右侧会打开程序的概述,概述主要列出了程序的 JVM 参数之类的。

点击 监控 可以看到当前程序所使用的资源情况,如 CPU, 堆,元空间,类,线程等

点击 线程 可以查看到当前程序运行的线程情况,如下面的 http-nio-8080-exec-* 表示 tomcat 的处理线程,目前处于驻留状态。

抽样器 和Profiler可以查看cpu和 内存的抽样情况(需要点内存,点CPU,抽样完,记得点一下停止),内存抽样:

CPU抽样:

内存 Profiler:

大家肯定会疑惑,怎么看不到 GC 的信息呢?别急,需要安装一个额外的 GC 插件。

安装完成后,重新打开进程就可以看到 VisualGC 选项卡了,这就非常直观的看到内存的区域划分了吧。

在这块的内容就可以看到包括Compile Time(编译时间)、Class Loader Time(类加载器加载类的时间)、GCTime(总GC的时间)、Eden、S0、S1、Old Gen(老年代大小)、Matadata(元空间的大小)。

监视 页面可以点击一下 执行垃圾回收 (相当于手动触发 GC),就可以观察到 GC 的变化,堆空间占用减少了

同时 Eden 区和 old 区内存也发生了变化

对于调优Java堆,主要关注的几块内容就是 Eden、S1、S0、Old Gen区域的大小变化,以及XXX collections、XXX ms属性的变化,他们分别表示:发生了多少次GC,以及发生GC过程的时间是多少。

VisualVM 还可以对堆存储文件进行分析,在监视页面可以执行 堆 Dump ,会将当前堆的情况进行转存生成一个 hprof 文件。

得到如下的 heapdump 文件信息

点击类,可以看到各个类所具有的实例数,双击某个类,可以具体看到实例数情况

好了,今天主要带大家认识了一下 VisualVM 的基本用法,VisualVM 是一个很强大很好用的 Java 性能分析工具,通过 VisualVM 可以清晰的了解到程序的 CPU, 内存 占用情况,再配上 GC 插件,更加清晰的看到 GC 的情况,非常有助于我们用来定位程序的卡点。

当然本文还没有涉及到解决具体的问题,后面的文章会继续探索通过 VisualVM 排查定位死锁及检测堆内存溢出的问题,敬请期待。

本次的分享到此结束,希望对你有所帮助。

如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!

本文由 黄彦祥 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。