性能工具之 JProfiler 简单登录案例分析实战

news2025/3/17 9:54:56

文章目录

  • 一、前言
  • 二、准备工作
  • 三、使用JProfile定位问题
  • 四、登陆案例分析
  • 四、总结

一、前言

JProfiler是一款 Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用的热点,即:哪个对象占用的内存比较多;或者CPU热点。

  • 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP

二、准备工作

在学习实例之前先了解什么是内存泄漏与内存溢出,先明白概念,就能理解案例中的内存泄漏是什么;

  • 内存溢出:(out of memory)指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出,简单来说就是自己所需要使用的空间比我们拥有的内存大内存不够使用所造成的内存溢出。
  • 内存泄漏:(Memory Leak)是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄漏,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

我们来演示内存泄露点击主菜单->session->Srart Center-> Open Session 窗口中, 选第一个示例项目 Animated Beaier Curve Demo, 点击按钮,在下一个窗口中都使用默认值,按按钮。这时示例程序就开始运行了,你就可以监视 JVM 的状态了。并且可以手动控制是否开始 模拟内存泄露, 和模拟线程阻塞的情况。

在这里插入图片描述
选择 startup -> configure

在这里插入图片描述
选择下面:

在这里插入图片描述
再次点击下面信息:

在这里插入图片描述

等待案例出现:
在这里插入图片描述
查看dos窗口如:

在这里插入图片描述
点击OverView试图:
在这里插入图片描述
字段说明:
在这里插入图片描述
等待运行一段时间,查看内存增长情况:

在这里插入图片描述

上图前半部分是模拟内存泄露,后半部分是关闭了模拟内存泄露。可发现内存泄露时 Heap内存呈增长趋势。可在大方向上发现存在内存泄露,但不知是具体原因什么引起的。

点击如下图的菜单,可以开始查看内存中对象的实例数量;
在这里插入图片描述

查看内存中对象的实例数量,找出不能被回收的对象。经过长时间的观察,下图中的 HashMap$Entry 实例数量一直在增长,最早时 HashMap$Entry 数量是 1 万左右,现在是 16 万多。可以断定就是它没有被释放。不一定数量最多的实例就是泄露,要根据业务情况分析。如果 1 个用户登录操作数据库,创建了一个连接,用户退出后,这个连接实现数量没有-1 (你开发时设计的会-1),就说明发生了泄露。
在这里插入图片描述
可以通过包名过滤,只显示你开发的类, 这个功能是非常有用的
在这里插入图片描述
点击mark current values就能到那些对象没有回收。
在这里插入图片描述
点击 heap walker

在这里插入图片描述
在这里插入图片描述
当前对象实例被谁引,引用了谁,请看下图:
在这里插入图片描述

线程阻塞:
在这里插入图片描述

点击右键:
在这里插入图片描述

很清晰看到里面情况

在这里插入图片描述
上面是简单入门,其他功能等到使用在介绍怎么使用;

三、使用JProfile定位问题

1、启动项目,并且选择启动的程序。
在这里插入图片描述
2、点击相关内容,如下:
在这里插入图片描述
3、页面显示如下:

在这里插入图片描述
注意下面400MB就是咱们启动配置的参数;

4、点击 CPU Tree

发现是这个里面是空白,这是因为这个功能会消耗资源,所以默认是不开启的,如果想分析点击该功能即可;
在这里插入图片描述

四、登陆案例分析

1、启动压力

注意:启动压力需要把时间设置长些,因为好分析性能问题;

在这里插入图片描述
2、点击cpu views

下面是目前请求的接口,
在这里插入图片描述
3、点击展开

通过观察目前代码基本都是 com.baomidou.mybatisplus 消耗资源。
在这里插入图片描述
再分析一个消耗cpu方法如下:

在这里插入图片描述
4、点击 Databases

点击打开,在点击jdbc链接,发现目前的链接数为10个链接。
在这里插入图片描述
10个链接是因为目前jmeter开启的是10个并发请求,数据是一一对应;

在这里插入图片描述
5、点击 Call Tree

在这里插入图片描述

发现如下语句调用很频繁,根据业务应该每登一次就插入一次日志,保存用户登陆日志信息。

INSERT INTO jsh_log (user_id, operation, client_ip, create_time, status, content) VALUES (?, ?, ?, ?, ?, ?)

执行EXPLAIN分析该插入语句如下:


mysql> EXPLAIN INSERT INTO jsh_log (user_id, operation, client_ip, create_time, status, content) VALUES ("212", "2323", "2323", "2323", "2020-10-0", "212");
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1  | INSERT      | jsh_log | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL | NULL     | NULL  |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
1 行于数据集 (0.02)

MySQL 信息如下:
在这里插入图片描述

查看查询信息发现如下语句出现:
在这里插入图片描述
第一条记录:

SELECT id, username, login_name, password, position, department, email, phonenum, ismanager, isystem, Status, description, remark, tenant_id FROM jsh_user WHERE (login_name = ? AND password = ? AND Status = ?)

打开数据库客户端执行该语句的执行计划如下:

mysql> EXPLAIN SELECT id,username,login_name, PASSWORD,position, department, email, phonenum, ismanager, isystem, STATUS, description, remark, tenant_id
FROM
  jsh_user
WHERE
  (
    login_name = "admin"
    AND PASSWORD = "e10adc3949ba59abbe56e057f20f883e"
    AND STATUS = 0
  );
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1  | SIMPLE      | jsh_user | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 3    | 33.33    | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 行于数据集 (0.02)

MySQL 信息如下:

图片结果如下:
在这里插入图片描述

目前系统用户数为:

mysql> select count(*) from jsh_user;
+----------+
| count(*) |
+----------+
| 3        |
+----------+
1 行于数据集 (0.02)

mysql>

第二条记录:

SELECT id, username, login_name, password, position, department, email, phonenum, ismanager, isystem, Status, description, remark, tenant_id FROM jsh_user WHERE (login_name = ? AND Status = ?)

查看表结构如下:
在这里插入图片描述

确实发现没有索引,导致通过用户名与密码查询没有走索引导致是全表扫描。

点击Hot spots

可以观察insert into jsh_log消耗大量时间:
在这里插入图片描述

四、总结

通过简单案例带领大家学习 JProfile 使用,也通过 JProfile 定位erp系统登陆接口是否有性能问题;大家会问咱们做性能是这样做的吗?其实在实际工作中还是有套路怎么做性能测试,目前这个案例是介绍怎么通过JProfile定位目前系统有什么问题,所以直接上手定位系统是否有问题;

通过 JProfile 定该系统存在 sql 有问题,sql调优先学习性能测试实战30讲中的《MySQL:数据库级监控及常用计数器解析》;

在这里插入图片描述(MySQL5 版本的架构示意图)

相关系列:

  • 性能工具之 JMeter ajax 简单登录案例实战-

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

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

相关文章

66、脑机接口产业联盟天津第一次全体大会参会分享

我注意到脑机联盟网上搜不到第一次和第二次大会的有关资料,这是非常遗憾的,所以我根据自己参会的记录,写成文章,与各位同学分享,此课件我也做成了公开课讲解,连接在我的Github。写这些,也算是为…

uAI - AI Assistant 人工智能辅助助手插件

uAI助手支持GPT 3.5 Turbo、GPT 3.5 Turbo16K、GPT 4-8k和GPT 4 Turbo-128k 什么是uAI助理? uAI Assistant是Unity游戏引擎的强大扩展,它使用GPT AI帮助游戏开发人员轻松创建专业代码和引人入胜的游戏内容。 你需要一个OpenAI密钥才能使用uAI助手!阅读我们的文档以获取更多说…

PDF 格式的文件编辑难度非常大,相比 .docx格式,它存在的意义是什么?

知乎上有个热门问题,PDF 格式的文件编辑难度非常大,相比 .docx格式,它存在的意义是什么? 回答这个问题得承认一个大前提,PDF是用来查看的,而不是编辑的。 否则就相当于提问,詹姆斯的足球踢得并…

Qt基础类03-直线类QLine

Qt基础类03-直线类QLine 摘要基本信息成员函数程序全貌QLine::QLine()QLine::QLine(const QPoint &p1, const QPoint &p2)QLine::QLine(int x1, int y1, int x2, int y2)QPoint QLine::p1() constQPoint QLine::p2() constint QLine::x1() constint QLine::x2() consti…

ComfyUI+Krea免费利用AI制作网站萌宠IP,五步搞定制作AI萌宠

大家好,这是我们网站的萌宠——Meo喵,是一只猫咪AI工具专家🐾,嘻嘻🎉🐱。是AIGC年轻的艺术家星之,利用AI产品ComfyUI、Krea,搭配PS制作而成,下面先介绍一下它的形象&…

LLM大模型教程:langchain 教程

软件安装 pip install pymupdf pip install langchain pip install langchain-cli conda install -c pytorch -c nvidia faiss-gpu1.7.4 mkl2021 blas1.0mkl由于langchain不支持qwen模型,我们需要自定义模型 from typing import Anyfrom langchain_core.language_…

‌Python开发者必学:如何优雅地绕过round函数的四舍五入陷阱

引言 在最近交付测试的一个功能中,测试同学反馈一个数据统计四舍五入的问题,问题有点魔性:同样的条件,有的值可以四舍五入成功,有的值直接被舍弃。 例如2.5四舍五入整数直接变成了2;3.5却变成了4。因为使用…

IDEA 模板配置

IDEA 模板配置 一、tkMapper通用mapper配置 1 新建配置文件generatorConfig.xml&#xff0c;路径src/main/resources/generator/generatorConfig.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-…

基于单片机的多功能电子钟设计

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP…

C学习(数据结构)-->排序

目录 一、直接插入排序 二、希尔排序 三、直接选择排序 四、快速排序 1、取基准值 1&#xff09;hoare找基准值​编辑 2&#xff09; 挖坑法找基准值​编辑 3&#xff09;快慢指针找基准值​编辑 2、递归快速排序 3、非递归快速排序 ​编辑 五、归并排序 ​编辑 六、计…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月7日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年9月7日 星期六 农历八月初五 白露 1、 司法部&#xff1a;遏制地方乱发文、出台“奇葩”政策文件等情况。 2、 证监会&#xff1a;拉长离职人员入股禁止期至10年&#xff0c;扩大对离职人员从严监管范围。 3、 全国医护比…

三文带你轻松上手鸿蒙的AI语音03-文本合成声音

三文带你轻松上手鸿蒙的AI语音03-文本合成声音 前言 接上文 三文带你轻松上手鸿蒙的AI语音02-声音文件转文本 HarmonyOS NEXT 提供的AI 文本合并语音功能&#xff0c;可以将一段不超过10000字符的文本合成为语音并进行播报。 场景举例 手机在无网状态下&#xff0c;系统应用…

超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)

超声波测距模块参考资料 1.电路连接及引脚配置 触发信号PA3只需要输出10us的高电平&#xff0c;所以直接设置成 普通的GPIO端口即可&#xff1b;回响信号使用外部中断&#xff0c;上升沿信号产生外部中断&#xff0c;打开定时器&#xff0c;下降沿再产生一次中断&#xff0c;读…

飞特STS3315基本使用方法

宁天道/FeelECH 01-介绍 串口总线舵机&#xff0c;可以通过一根线将多个舵机串联在一起&#xff0c;一个串口线片可以控制所有的舵机。 内带闭环&#xff0c;可以自定义舵机移动的最大速度&#xff0c;加速度&#xff0c; 可以修改各种模式&#xff0c;满足各种各样的需求&…

OTN光传送网-介绍

1. 引用 OTN光传送网--华为设备_otn传输设备建设方案-CSDN博客 OTN光传送网&#xff08;Optical Transport Network&#xff09;&什么是OTN-CSDN博客 https://zhuanlan.zhihu.com/p/403304019 术语&#xff1a; 英文缩写描述灰光模块彩光模块CWDM&#xff1a;Coarse Wa…

欺诈文本分类检测(十三):交叉训练验证

1. 引言 交叉验证主要讨论的是数据集的划分问题。 通常情况下&#xff0c;我们会采用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集&#xff0c;这三个集合不能有交集&#xff0c;常见的比例是8:1:1&#xff08;如同前文我们所作的划分)。这三个数据集…

吉利星座03组卫星发射

北京时间2024年9月6日2时30分&#xff0c;在太原卫星发射中心使用长征六号运载火箭&#xff0c;成功将民营“中国星链”——吉利未来出行星座第三个轨道面、吉利星座03组卫星发射升空&#xff0c;10颗卫星顺利进入预定轨道&#xff0c;发射任务获得圆满成功。此次任务是长征系列…

飞思相机存储卡格式化数据如何恢复?提供全面指南

在数字摄影时代&#xff0c;‌飞思相机以其卓越的成像质量和专业的性能&#xff0c;‌赢得了众多摄影师的青睐。‌然而&#xff0c;‌即使是专业的设备也难免遭遇数据丢失的困境&#xff0c;‌尤其是当存储卡不幸被格式化时。‌面对这一突如其来的灾难&#xff0c;‌许多摄影师…

qt QGraphicsScene场景坐标和场景内GraphicsItem局部坐标的相互转换

为了更清晰地解释场景坐标与局部坐标之间的转换过程&#xff0c;我们可以通过一个简单的实例来演示如何赋值场景坐标&#xff0c;并将其转换为图形项的局部坐标。 实例步骤 假设我们有一个场景 QGraphicsScene 和一个矩形图形项 QGraphicsRectItem&#xff0c;矩形的大小为 1…

Redis进阶(六):缓存

1.缓存 速度快的设备可以作为速度慢的设备的缓存 缓存能够有意义&#xff1a;二八定律&#xff0c;20%的数据可以应对80%的请求 通常使用redis作为数据库的缓存&#xff08;mysql&#xff09; 数据库是非常重要的组件&#xff0c;mysql速度比较慢 因为mysql等数据库&#x…