当前位置: 首页 > news >正文

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

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


http://www.mrgr.cn/news/48222.html

相关文章:

  • 【java基础系列】实现数字的首位交换算法
  • 用C#(.NET8)开发一个NTP(SNTP)服务
  • 大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
  • 三格电子——新品IE103转ModbusTCP网关
  • Win10将WindowsTerminal设置默认终端并添加到右键(无法使用微软商店)
  • Qt creator ,语言家功能缺失解决方法
  • 付费计量系统实体和接口(7)
  • [C语言] 函数详解:库函数与自定义函数
  • 职场上的人情世故你知多少
  • 从automaxprocs库浅窥Linux容器的资源控制
  • 【测试】测试分类
  • 腾讯云-云直播
  • Linux:信号保存与处理
  • H3C OSPF 综合排错实验
  • Breach 2.1靶机渗透
  • 【网络安全】25,000$任意账户接管
  • 基于Python flask的豆瓣电影可视化系统,豆瓣电影爬虫系统
  • 【Spring详解】Maven从安装到应用(Maven Help插件的安装)-国内源的配置(中央仓库及私服的概念)
  • vue3 element table 插槽外的数据更新,插槽内的数据未更新。
  • ESP32—c3实现网页显示ADC电压并实时更新
  • 0.1s速通小猿口算保姆教程
  • 【翻译】自定义 Qt Designer 窗体
  • 动态规划-路径问题——174.地下城游戏
  • git的提取和拉取有啥区别
  • Java 桶排序
  • 【Kuberntes】kubernets资源类型service详细介绍