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

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/

写到最后

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

相关文章:

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

最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…...

数据中心虚拟化与高可用性架构实施指南

数据中心虚拟化与高可用性架构实施指南 项目背景 随着业务的不断扩展和技术的迭代更新,公司决定采用虚拟化技术和构建高可用性架构来提高数据中心的资源利用率和业务连续性。本项目旨在详细描述运维人员在实施数据中心虚拟化和高可用性架构过程中的关键步骤和任务…...

对文件内的文件名生成目录,方便查阅

import os import re# 定义要查找的目录路径 path r"J:\...\顺序目录" # 要遍历的主目录路径# 定义输出的目录文件路径 output_file r"J:\...\目录_中文文件.txt" # 保存结果的文件路径# 判断文件名是否包含中文字符 def contains_chinese(text):retur…...

leetcode hot100 轮转数组

189. 轮转数组 已解答 中等 相关标签 相关企业 提示 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮…...

定位方式:css

使用相对路径 div ul #div下的所有ul,空格表示相对路径(这个实际中用的多一些) 绝对路径-一般不用绝对路径 html>head>div,“>”表示根路径 使用class名称定位 使用.表示 使用id定位 使用#表示 使用属性定位 [属性名…...

谷歌浏览器的网络连接问题解决方案

在数字化时代,网络浏览器已成为日常工作和生活中不可或缺的工具。谷歌浏览器以其快速、稳定和丰富的功能深受用户喜爱。然而,就像其他软件一样,谷歌浏览器也可能遇到网络连接问题,这可能由多种因素引起。本文将为您提供一系列解决…...

保护模式基本概念

CPU 架构 RISC(Reduced Instruction Set Computer) 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的(如ARM是32位的指令)、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…...

Linux程序设计(第四版)| 学习笔记

上次学习Linux相关内容还是上学的时候为了应付考试,最近有项目涉及Linux,重新学习以下。 很多年前关于Linux的总结 一、入门 1.概念 (1) UNIX 1)定义:指的是一种遵循特定规范的计算机操作系统。 2)特点:简单性、集中性、可重用…...

【Python-中级】Python中的线程池:ThreadPoolExecutor

Python中的线程池:from concurrent.futures import ThreadPoolExecutor 在Python中,实现多线程编程的方法有很多,而ThreadPoolExecutor 是一个简单且高效的线程池工具。它提供了高层次的接口,用于并发地运行任务,同时隐藏了许多复杂的底层细节,非常适合日常的多线程任务…...

医疗信息系统有哪些

医疗信息系统(Health Information Systems, HIS)是用于管理和存储患者健康数据、医疗记录、医院运营数据等信息的技术平台。这些系统通过自动化、集成和分析数据,提高医疗服务的效率、质量和安全性。以下是一些主要的医疗信息系统及其功能&am…...

JVM系列(十二) -常用调优命令汇总

最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…...

修改采购订单BAPI学习研究-BAPI_PO_CHANGE

这里是修改采购订单BAPI,修改订单数量的简单应用 代码 *&---------------------------------------------------------------------* *& Report Z_BAPI_PO_CHANGE *&---------------------------------------------------------------------* *& C…...

使用uniapp开发微信小程序-框架搭建

最近要开发一个小程序,为了降低学习成本,最后还是选择使用uniapp来开发,但是由于电脑性能不行,实在不想多跑一个应用程序,就简单搭建了一个可以用vscode跑的uniapp项目。 项目整体技术栈:vue3 pinia type…...

雅思真题短语(九)

真题短语收录在合辑 141华夫饼 waffles 142防腐剂 no preservatives 143精制 refined sugar 144水分充足 plenty of moisture 145五角星 five-pointed star 146树皮 tree bark 147汁液 liquid sap 148敲击 several taps 149蒸发 water evaporates 150干旱的山谷 arid valleys …...

系统压力测试助手——stress-ng

1、背景 在系统性能测试和压力测试中,stress-ng 是一个非常强大的工具,广泛应用于对 Linux 系统进行各种硬件和软件方面的负载测试。它能够模拟多种极端负载情况,帮助开发人员和运维人员检查系统在高负载下的表现,以便发现潜在的…...

java如何使用poi-tl在word模板里渲染多张图片

1、poi-tl官网地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定义word模板 释义&#xf…...

UE5 UHT GENERATED_BODY() GENERATED_USTRUCT_BODY()

你在 .h 文件中写的 GENERATED_BODY() 宏本身并不是 GetPrivateStaticClass() 函数的声明。 实际上&#xff0c;GENERATED_BODY() 是一个预处理器宏&#xff0c;它会被 Unreal Header Tool (UHT) 处理。 UHT 会读取你的 .h 文件&#xff0c;识别 UCLASS() 和 GENERATED_BODY(…...

内网穿透ubuntu20 docker coplar

sudo apt-get install curl curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash ubuntu-base报错 /sbin/init:No such file or directory解决办法 apt install systemd 命令安装即可 cpolar version 1.3 token认证 登录cpolar官网后台…...

windows C++ TCP客户端

demo有一下功能 1、心跳包 2、断开重连 3、非阻塞 4、接受数据单独线程处理 #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <windows.h> #include <string> #include <process.h> // 用于Windows下的线程相…...

Linux xargs 命令使用教程

简介 xargs 是一个功能强大的 Linux 命令&#xff0c;用于从标准输入构建和执行命令。它接受一个命令的输出&#xff0c;并将其作为参数提供给另一个命令。它在处理大量输入时特别有用&#xff0c;其含义可以解释为&#xff1a;extended arguments&#xff0c;使用 xargs 允许…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...