死磕P7:JVM性能调优必知必会(二)
这是「死磕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 排查定位死锁及检测堆内存溢出的问题,敬请期待。
END
好了,今天的分享就到这里,关注公&号:新质程序猿,和我一起死磕 P7, 一起学习成长。
感谢大家的阅读,如果有任何异议的地方,欢迎指正,也欢迎大家公号找到我与我做朋友!