性能分析之使用 Jvisualvm dump 分析示例

2024-08-31 01:28

本文主要是介绍性能分析之使用 Jvisualvm dump 分析示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

在 JMeter 入门系列中相信大家对工具使用已经没问题,今天开起性能测试进阶系列之 jvisualvm 工具简单学习,目标是通过演示 Jvisualvm 工具定位代码,帮助性能测试工程师直接定位代码位置,协助开发解决性能问题;

前置条件:

  • 1、本机 JDK 并且工具包中有 Jvisualvm
  • 2、本机安装JMeter
  • 3、本机能运行 idea 或者能运行 Demo 代码

二、线程状态

常见的线程状态为如下:
在这里插入图片描述

了解上面信息后,打开idea编写简单代码如下:

@GetMapping("/7d")
@ResponseBody
public R indexPage() {HashMap<String, Object> map = new HashMap<>();map.put("success", "欢迎来到性能实战课堂");return R.ok().put("data", map);
}
/*** 运行线程** @return*/
@GetMapping("/runnable")
@ResponseBody
public R runnable() {List<MemberEntity> list = pageIndexService.selectAll();return R.ok().put("data", list);
}
/*** 运行线程** @return*/
@GetMapping("/sleep")
@ResponseBody
public R sleep() {List<MemberEntity> list = pageIndexService.selectSleepAll();return R.ok().put("data", list);
}

启动工程:
在这里插入图片描述

访问如下:
在这里插入图片描述

三、JMeter与Jvisualvm

打开 JMeter 并且编写脚本成功如下:
在这里插入图片描述

打开 Jvisualvm 工具选择自己启动的工程:
在这里插入图片描述

即可看到当前系统配置,点击线程标签如下图,再点击时间线标签即可按名称排序,在这里问一个问题,为什么 http-nio-8080 线程数是10个,大家可以思考下,不知道的也没关系,继续往下学习,答案会揭晓。
在这里插入图片描述
查看配置文件:application.properties 输入server.tomcat.threads-min-spare就能看的默认参数是10。
在这里插入图片描述
这个参数是否是刚才看到的线程数,咱们可以修改为5,启动工程,点击线程如下:

在这里插入图片描述
小伙伴们你们猜对了吗?如果猜对恭喜你们可以开始开启 jar 微服务工程性能参数调优,如果没有猜对的希望通过这次学习后知道怎么修改参数,目前很多工程还是tomcat工程,想问一个问题就是默认 tomcat 参数在什么地方修改,这个大家可以自己想一想在什么地方修改。

源码位置如下:
在这里插入图片描述
在这里插入图片描述

四、Jvisualvm代码定位

  • 第一步:Jmeter 压力持续执行,目的方便定位代码
  • 第二步:打开 Jvisualvm 工具点击线程结果如下:
    在这里插入图片描述
    通过上面线程可以看出目前线程开始运行,线程只有运行情况下才会消耗CPU,点击监视即可看到相关资源消耗如:
    在这里插入图片描述
    更换Jmeter请求,并且继续执行Jmeter:
    在这里插入图片描述

打开 jvisualvm 发现大量线程在 sleep 如图,大家可以想一想下一步应该做,在这一讲中主要讲解通过现象定位到代码行中,其实在做性能测试过程中,线上环境很少能用这样的工具操作一般会直接通过命令打dump之后把文件下载到本地进行分析,在线上因为会消耗性能,但是在测试环境或者对于性能学习使用工具定位能力还是需要。

如果不会分析可以学习**《性能测试实战30讲》之06丨倾囊相授:我毕生所学的性能分析思路都在这里了**
在这里插入图片描述
看的现象是slepp,点击dump,看线程找到自己工程的包,再看代码在做什么业务,导致目前线程在sleep状态中:
在这里插入图片描述
通过上面dump定位发现线程处于TIMED_WAITING (sleeping) ;

在这里插入图片描述
上面箭头数字表示目前代码行数,打开工程对比是否定位到代码行如:

在这里插入图片描述

通过dump的线程直接定位代码行数,剩下的就是分析业务代码逻辑进行代码调优。

五、线程阅读方法

选择一段线程:
在这里插入图片描述

查看方法是: 线程调用逻辑是从下往上看

在提出第一行进行分析:

"http-nio-8080-exec-4" #209 daemon prio=5 os_prio=31 tid=0x00007fdd7927f000 nid=0x7203 waiting on condition [0x000070000f277000]
  • 线程名称:“http-nio-8080-exec-4”
  • 线程优先级:prio=5
  • 线程对应的本地线程id号:nid=0x7203
  • 线程的状态:waiting
  • 线程占用内存地址 [0x000070000f277000]

打开idea 生成 Sequence Diagram 生成如下图:
在这里插入图片描述

通过这个图应该就明白他们调用关系,想起左老师一句话 “一图胜千句”。

六、总计

通过简单一个案例让大家快速通过 jvisualvm 工具定位到代码,在做性能测试过程中掌握几个常用工具能快速解决问题也是不错。

这篇关于性能分析之使用 Jvisualvm dump 分析示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1122489

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499