死磕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, 一起学习成长。

感谢大家的阅读,如果有任何异议的地方,欢迎指正,也欢迎大家公号找到我与我做朋友!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值