JVM系列(十三) -常用调优工具介绍

最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。

  • JVM系列(一) -什么是虚拟机
  • JVM系列(二) -类的加载过程
  • JVM系列(三) -内存布局详解
  • JVM系列(四) -对象的创建过程
  • JVM系列(五) -对象的内存分配流程
  • JVM系列(六) -运行期优化技术
  • JVM系列(七) -垃圾收集算法
  • JVM系列(八) -垃圾收集器
  • JVM系列(九) -GC日志分析
  • JVM系列(十) -常用调优命令汇总
  • JVM系列(十一) -常用调优工具介绍
  • JVM系列(十二) -常用调优参数总结

一、摘要

在之前的文章中,我们介绍了 JVM 常用的命令使用,通过这些命令可以快速的查询线上服务的性能情况和排查相关的问题。

不错,命令确实非常的管用,但是要想熟悉的记住这些命令,并非易事,除非很频繁的使用,否则真的很难。多数情况下,如果代码编程合理,服务器配置合理,服务也没有高并发压力,开发人员基本上很少会去关注 JVM 相关性能情况。

因此,对于绝大部分开发者而言,都希望有一个可视化的界面来展示当前服务的性能指标,当需要的时候,直接将线上服务的 dump 文件导出,然后导入到相关工具中通过界面来查询分析结果,而不是通过枯燥的命令来快速排查服务故障。

下面我们就一起来看看几款比较优秀的 JVM 可视化分析工具。

二、JDK 自带的工具

2.1、jconsole

jconsole 是一款 JDK 自带的可视化监控工具,可以用于查看应用程序的运行概况、内存、线程、类、VM 概括、MBean 等信息。它是一个基于 JMX(java management extensions)的 GUI 性能监测工具,从 JDK1.5 开始加入。

2.1.1、启动方式

在命令行输入jconsole即可启动。如果 Windows 用户,也可以在 jdk 的安装目录的 bin 目录下,找到jconsole.exe,双击启动。界面如下。

可以直接选择本地 JVM,也可以通过 JMX 方式连接远程 JVM。

如果监控远程服务,比如 tomcat 服务,可以在启动脚本中添加如下代码,以便支持远程连接。

-Dcom.sun.management.jmxremote.port=6969  -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false

点击连接之后,可能会弹出如下的界面,选择“不安全的连接”即可。

进入之后,就可以看到 jconsole 概览图和主要的功能,例如概述、内存、线程、类、VM、MBean 等板块。概览界面如下。

2.1.2、内存板块

内存板块主要展示了内存的使用情况,同时可以查看堆和非堆内存的变化值对比,也可以点击执行 GC 来触发 GC 的执行。界面如下。

2.1.3、线程板块

线程板块主要展示线程数的活动数和峰值,点击左下方线程可以查看线程的详细信息,比如线程的状态是什么,堆栈内容等,同时也可以点击“检测死锁”来检查线程之间是否有死锁的情况。界面如下。

2.1.4、类板块

类板块主要展示已加载的类数量。界面如下。

2.1.5、VM 概要板块

VM 概要板块主要展示 JVM 所有信息总览,包括基本信息、线程相关、堆相关、操作系统、VM 参数等。界面如下。

2.1.6、MBean 板块

MBean 板块主要展示被管理的 Bean 的属性,方法等。界面如下。

2.2、VisualVM

VisualVM 也是一款 JDK 自带的可视化监控工具,利用它不仅能够监控服务的 CPU、内存、线程、类等信息,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享,从 JDK1.6 开始加入。

与此同时,VisualVM 使用也很简单,几乎 0 配置,功能比较丰富,几乎囊括了 JDK 自带命令的所有功能,也是平时使用最多的调优工具之一。

2.2.1、启动方式

在命令行输入jvisualvm即可启动。如果 Windows 用户,也可以在 jdk 的安装目录的 bin 目录下,找到jvisualvm.exe,双击启动。界面如下。

可以直接选择本地 JVM,也可以远程连接 JVM。这里选择本地 JVM 进程,双击某个进程即可打开。

进入之后,就可以看到 VisualVM 相关的展示界面,例如概述、监视、线程、抽样器等板块。概述界面如下。

2.2.2、监视板块

监视板块主要展示 cpu、内存、线程、类的统计图表,也支持手动执行垃圾回收和生成堆 Dump 文件。界面如下。

点击“堆 Dump”按钮之后,就会生成一份当前时刻的堆文件快照,在界面上可以查询当前文件的对象大小分析结果。界面如下。

同时还支持与另一个堆文件进行比较,展示差异信息。界面如下。

2.2.3、线程板块

线程板块主要展示线程的活动数。界面如下。

点击“线程 Dump”按钮之后,就会生成一份当前时刻的线程快照,在界面上可以查询线程的状态。界面如下。

2.2.4、抽样器板块

抽样器板块可以对 CPU、内存在一段时间内进行数据抽样,以供分析。界面如下。

比如,点击“CPU”按钮之后,可以实时的查询线程和方法占用 CPU 时间长短排名,点击“停止”按钮即可结束抽样。

同理,点击“内存”按钮之后,可以实时的查询堆中对象占用大小排名以及每个线程分配的内存大小排名。

2.2.5、插件安装

VisualVM 还有一大亮点,就是它支持插件安装。每个插件的关注点都不同,有的是监控 GC,有的是监控内存,有的是监控线程等,可以在插件市场上寻找对应的工具进行安装,以便更好的排查服务性能问题。

如何安装插件呢?

在 VisualVM 的菜单栏,点击“工具” -》 “插件”,便会弹出如下界面。

在“可用插件”栏中,选中需要安装的插件,点击“安装”,一路完成,最后重启 VisualVM,即可完成插件的安装。

如果获取可用插件异常,可以访问如下地址,找到对应版本范围,包含安装 JDK 版本的链接。

https://visualvm.github.io/pluginscenters.html

拷贝出对应的链接,然后在设置栏中填入对应的地址即可。

通常,我们会将 Visual GC 插件安装到 VisualVM 中,利用它可以更加直观的观察到整个垃圾回收的过程。界面如下。

三、第三方调优工具

除了 JDK 自带的 JVM 可视化分析工具之外,市场上还诞生了很多比较优秀的性能监控工具,比如下面这几款工具。

  • MAT:一款功能强大的 Java 堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况,用户可以利用 visualvm 或者是 jmap 命令生产堆文件,然后导入工具中进行分析
  • GCeasy:一款在线的 GC 日志分析器,使用起来非常方便,用户可以通过它的 web 网站导入 GC 日志,实时进行内存泄漏检测、GC 暂停原因分析、JVM 配置建议优化等功能
  • GCViewer:一款非常强大的 GC 日志可视化分析工具,功能强大而且完全免费
  • JProfiler:一款商用的性能分析利器
  • arthas:阿里开源的一款线上监控诊断工具,可以查看应用负载、内存、gc、线程等信息

在此,我们重点的介绍一下 Arthas 这款工具,因为它的功能比较全,并且文档详细。

3.1、Arthas

根据官方的介绍,Arthas(阿尔萨斯)是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas 官方地址如下!

https://arthas.aliyun.com/
3.1.1、启动方式

Arthas 的启动方式非常简单,它就是一个 jar 包,通过java -jar命令即可运行。

jar 包的下载地址如下。

https://arthas.aliyun.com/arthas-boot.jar

输入如下命令,即可启动 Arthas。

 java -jar arthas-boot.jar

启动成功后,可以看到如下界面。

意思是发现有以下几个 Java 应用服务,请选择想要监控的进程,输入前面对应的编号,就可以开启进行监控模式了。比如我输入编号 1。

进入以上这个界面,就表示应用监听成功了。

3.1.2、dashboard仪表盘

dashboard 仪表盘用于展示整体项目运行情况,可以在命令窗口输入如下命令来查看。

dashboard

回车之后,一共有三块信息,分别是线程信息、内存信息、运行时信息,界面如下。

3.1.3、thread 命令

如果我们想要具体查看某一个线程的运行情况,可以使用 thread 命令。例如查询线程 Id 为16的运行状态信息,命令如下。

thread 16

还可以通过如下命令,查询所有的线程信息。

thread -all

3.1.4、jad 命令

某些时候我们想要查询线上的源码是否正确发布,可以通过 jad 命令来反编译类,以此来查询源码信息,例如反编译Application类,命令如下。

jad com.example.boot.Application

3.1.5、watch 命令

某些场景下我们想要观察某个方法的返回结果,以便判断是否符合预期效果,可以通过 watch 命令来实现,例如观察TestController类的queryAll()方法的返回结果,命令如下。

watch com.example.boot.test.web.TestController queryAll returnObj

需要前端发起请求,如果执行到这里就会有数据。输出示例结果如下。

更多的玩法,可以阅读官方文档。

四、小结

本文主要围绕 JVM 相关的可视化分析工具,进行了知识内容的整合和总结,内容比较多,如果有描述不对的地方,欢迎大家留言指出,不胜感激。

五、参考

1.http://www.ityouknow.com/jvm/2017/09/22/jvm-tool.html

2.https://arthas.aliyun.com/doc/

写到最后

最后。如果感觉文章内容不错,帮忙动动小指头点个赞,点赞对我真的非常重要!加个关注我会非常感激!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1)导出数据到本地目录 2)导出到hdfs的目录下 3)直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

使用RKNN进行YOLOv8人体姿态估计的实战教程:yolov8-pose.onnx转yolov8-pose.rknn+推理全流程

之前文章有提到“YOLOv8的原生模型包含了后处理步骤,其中一些形状超出了RK3588的矩阵计算限制,因此需要对输出层进行一些裁剪”,通过裁剪后得到的onnx能够顺利的进行rknn转换,本文将对转rnkk过程,以及相应的后处理进行阐述。并在文末附上全部源码、数据、模型的百度云盘链…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR10进行…

继承详细总结

一.继承的定义与概念 1.定义:继承是一种is-a的关系,例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。 2.允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数) 和 属…

批量多线程给TXT文档插入相关腾讯AI【高质量无水印无版权】原创图片

给蜘蛛访问的网站文章插入相关图片,可以带来以下好处: ‌1、提升用户体验‌:图片能够直观地展示文章内容,帮助用户更好地理解和消化信息。对于阅读者来说,图文并茂的内容往往更具吸引力,也能提高他们的阅读…

牵手红娘:牵手App红娘助力“牵手”,脱单精准更便捷

随着互联网的普及,现代青年的社交圈层加速扩大,他们的恋爱观也正经历着前所未有的转变。在繁忙的工作之余,人们希望能够找到一种既高效又真诚的交友方式。于是,线上交友平台成为了他们寻找爱情的新选择。让不同文化背景、不同工作…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程,需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢?使用SysTick,那么怎么使用SysTick来模拟多线程呢?前面我们知道SysTick就是一个定时器,它不是在主函数的while循…

麒麟信安受邀出席开放原子园区行暨供需对接活动,分享基于关基领域打造的行业解决方案

12月17日,武汉市经信局和开放原子开源基金会共同主办开放原子园区行暨供需对接活动,旨在推进武汉市开源体系建设,推动开源技术赋能千行百业。活动吸引了武汉市委金融办、市卫健委、疾控中心、医保局、信息中心(大数据中心)、市红十字会、银行…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发,通过简单的语法很容易就能创建一个 go 程,这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程,但是要想完全理解 go 程我们需要深入研究 GPM 模型,关于 GPM 模型…

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767&a…

SOME/IP 协议详解——信息格式

文章目录 1. 头部格式1.1 消息 ID(Message ID)1.2 长度(Length)1.3 请求 ID(Request ID)1.4 协议版本(Protocol Version):1.5 接口版本(Interface Version&am…

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成:分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

用 gdbserver 调试 arm-linux 上的 AWTK 应用程序

很多嵌入式 linux 开发者都能熟练的使用 gdb/lldb 调试应用程序,但是还有不少朋友在调试开发板上的程序时,仍然在使用原始的 printf。本文介绍一下使用 gdbserver 通过网络调试开发板上的 AWTK 应用程序的方法,供有需要的朋友参考。 1. 下载 …

树莓派换源

查询自己版本: lsb_release -a bullseye可以理解为树莓派的系统代号(10,11,12都不同,一定要看好自己系统是什么版本) 查询架构 uname -a aarch64的地方就是代表系统架构的,我的是aarch64的架…

MySQL索引-索引的结构和原理

索引原理 查找算法 顺序查找 数组链表 二分查找 B树跳表 散列查找 Hash表 DFS 树图 BFS 树图 分块查找 海量数据 Hash结构 Hash索引可以方便的提供等值查询,但是对于范围查询就需要全表扫描了。 Hash索引在MySQL 中Hash结构主要应用在InnoDB 自适应哈希索引。…

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的,但是我们前面接触的文件都是系统中的文件,都是已经在进…

深度学习中的并行策略概述:2 Data Parallelism

深度学习中的并行策略概述:2 Data Parallelism 数据并行(Data Parallelism)的核心在于将模型的数据处理过程并行化。具体来说,面对大规模数据批次时,将其拆分为较小的子批次,并在多个计算设备上同时进行处…

分布式专题(10)之ShardingSphere分库分表实战指南

一、ShardingSphere产品介绍 Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus,旨在…

帧缓存的分配

帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…