springboot整合JMH做优化实战
这段时间接手项目出现各种问题,令人不胜烦扰。吐槽下公司做项目完全靠人堆,大上快上风格注定留下一地鸡毛,修修补补不如想如何提升同事代码水准免得背锅。偶然看到关于JMH对于优化java代码的直观性,于是有了这篇文章,希望能帮到大家。
一:基础介绍文章
基准测试神器JMH——详解36个官方例子 - 知乎
这里介绍引入项目方式,各种基本注解用法,用例。比较全面,推荐大家学习
二:boot项目实用
注意事项:1.jdk版本大于9,最好使用的openJDK,其他的也行
2.做测试最好放在test包下,不影响正常项目使用
2-1 一般项目优化需求:
一个简单方法,一个service接口(这个比较多。下面以这个为例)
场景1: 有个根据实例获取报警信息的接口
需求是要测试下,不同的多个实例对接口相应的影响,这里我分成1.2.3
直接test文件下新建
import com.chitic.things.device.api.request.monitor.AlarmSnsRequest;
import com.chitic.things.device.service.MonitorOnlineService;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;/*** 类功能说明: //** @author Zhouxl* @date 2023/8/10 14:25*/
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS) //仿JVM进行预热行为,提高命中率(1s 3次)
public class BenchmarkTest {private ConfigurableApplicationContext context;private MonitorOnlineService onlineService;@Setuppublic void init() {// 这里的WebApplication.class是项目里的spring boot启动类context = SpringApplication.run(CommonApplication.class);// 获取需要测试的beanthis.onlineService = context.getBean(MonitorOnlineService.class);}@Benchmarkpublic void one(){AlarmSnsRequest snsRequest =new AlarmSnsRequest();String str="test";snsRequest.setSns(Arrays.asList(str.split(",")));//测试接口方法onlineService.alarmPageBySns(snsRequest);}@Benchmarkpublic void two(){AlarmSnsRequest snsRequest =new AlarmSnsRequest();String str="test,test1";snsRequest.setSns(Arrays.asList(str.split(",")));//测试接口方法onlineService.alarmPageBySns(snsRequest);}@Benchmarkpublic void three(){AlarmSnsRequest snsRequest =new AlarmSnsRequest();String str="test,test1,test2";snsRequest.setSns(Arrays.asList(str.split(",")));//测试接口方法onlineService.alarmPageBySns(snsRequest);}@TearDownpublic void down() {context.close();}public static void main(String[] args)throws RunnerException {Options opts = new OptionsBuilder().include(BenchmarkTest.class.getSimpleName()).resultFormat(ResultFormatType.JSON) //导出json 可通过 http://deepoove.com/jmh-visual-chart/ 对比//.addProfiler(StackProfiler.class) //栈内存解析,主要分析方法的耗时情况// .addProfiler(GCProfiler.class) //JVM GC的情况 各区的情况(G1的垃圾回收器情况)//.addProfiler(HotspotMemoryProfiler.class) //使用HotSpot VM 进行内存占用分析.forks(1) //进程数.build();new Runner(opts).run();}
}
测试结果:1个时耗时大概0.38s,2个和3个消耗会增加,但区别不大

可以在项目中对任意接口进行测试,还可以图形化接口比较,直接体现你的优化价值
JMH Visual Chart 生成的json引入这里生成图标
2-2 接口分析需求
场景2: 有个接口一直导致卡死或者内存OOM,代码是依托答辩,看了头晕
这里就需要借助JVM对堆栈内存,找出耗时情况,哪种应对哪个情况我已经上面列出来了:
package com.chitic.demo.controller.demo;import com.chitic.demo.Application;
import com.chitic.demo.controller.HartCheck;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.profile.GCProfiler;
import org.openjdk.jmh.profile.HotspotMemoryProfiler;
import org.openjdk.jmh.profile.StackProfiler;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;import java.util.Arrays;
import java.util.concurrent.TimeUnit;/*** 类功能说明: //对堆栈和GC内部** @author Zhouxl* @date 2023/8/10 14:59*/
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS) //仿JVM进行预热行为,提高命中率(1s 3次)
public class JvmTest {private ConfigurableApplicationContext context;private HartCheck hartCheck;@Setuppublic void init() {// 这里的WebApplication.class是项目里的spring boot启动类context = SpringApplication.run(Application.class);// 获取需要测试的beanthis.hartCheck = context.getBean(HartCheck.class);}@Benchmarkpublic void one(){//测试接口方法hartCheck.getUser();}@TearDownpublic void down() {context.close();}public static void main(String[] args)throws RunnerException {Options opts = new OptionsBuilder().include(JvmTest.class.getSimpleName()).addProfiler(StackProfiler.class) //栈内存解析,主要分析方法的耗时情况
// .addProfiler(GCProfiler.class) //JVM GC的情况 各区的情况(G1的垃圾回收器情况)
// .addProfiler(HotspotMemoryProfiler.class) //使用HotSpot VM 进行内存分析.resultFormat(ResultFormatType.JSON) //导出json 可通过 http://deepoove.com/jmh-visual-chart/ 对比.forks(1) //进程数.build();new Runner(opts).run();}}
2-2-1.addProfiler(StackProfiler.class) //栈内存解析,主要分析方法的耗时情况
栈内存分析,主要看这些内容:

就可以看到栈内耗时情况了,然后动手处理
2-2-2.addProfiler(GCProfiler.class) //JVM GC的情况 各区的情况(G1的垃圾回收器情况)

G1垃圾回收器的各种状态情况
2-2-3..addProfiler(HotspotMemoryProfiler.class) //使用HotSpot VM 进行内存分析
展示数据和jstack的类似,能快速定位到哪些类占用内存,因为我的项目用的是graalvm17没办法用,只能各位自行探索了
相关文章:
springboot整合JMH做优化实战
这段时间接手项目出现各种问题,令人不胜烦扰。吐槽下公司做项目完全靠人堆,大上快上风格注定留下一地鸡毛,修修补补不如想如何提升同事代码水准免得背锅。偶然看到关于JMH对于优化java代码的直观性,于是有了这篇文章,希…...
利用ffmpeg分析视频流
ffprobe -show_packets -i "rtsp://192.168.61.46:8554/live?channel0&type0":该命令用于显示 RTSP 流中的数据包信息,例如时间戳、大小、持续时间等。 ffprobe -i "rtsp://192.168.61.46:8554/live?channel0&type0"&…...
基于kettle实现pg数据定时转存mongodb
mogodb 待创建 基于kettle实现pg数据定时转存mongodb_kettle 实时迁移 mongodb_呆呆的私房菜的博客-CSDN博客...
使用 POI 在 Word 中重新开始编号、自定义标题格式
效果图 引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!-- https…...
【java】default/private/public/protected比较
访问修饰符 访问修饰符本类同包子类其他privateYdefaultYYprotectedYYYpublicYYYY 总结: private、default、proteced、public访问范围依次增大、限制能力依次减弱;被private修饰的成员只能在本类中调用;default是默认类型,成员…...
面试热题(最长上升子序列)
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 输入࿱…...
Vue 简版文件预览笔记
简版文件预览笔记 调用方法 <script lang"ts" setup>import {exportFileData,preViewFile,} from /xxx/tools.ts;import {fileDownload,} from /api/xxx/xx;// 预览方法const handleViewBtn () > {const filePath 获取预览地址;const urlFormat 获取预…...
数据结构--栈和队列
文章目录 栈的概念和结构栈的实现栈的数据结构栈的初始化和销毁出栈和入栈获取栈顶、大小,判空 队列的概念和结构队列的实现队列的数据结构队列的初始化和销毁队列的插入 队列的删除获取队头和队尾的数据获取队列长度和判空 栈和队列的一些题目1.有效的括号2.用队列…...
泰国的区块链和NFT市场调研
泰国的区块链和NFT市场调研 基本介绍 参考: https://zh.wikipedia.org/zh-hans/%E6%B3%B0%E5%9B%BD参考: https://hktdc.infogram.com/thsc–1h7k2303zo75v2x zz制度: 君主立宪制(议会制) 国王: 玛哈哇集拉…...
精彩回顾 | D-Day深圳 上海站:高频策略研发再提速
上周末,DolphinDB 分别在上海及深圳成功举办了两场 D-Day 分享会,来自国内头部券商、公募基金以及多家私募机构的数十位核心策略研发、数据分析专家们分享了 DolphinDB 在量化交易各个环节的使用经验,并基于与同类技术栈的优劣势对比…...
新法!《个人信息保护合规审计管理办法(征求意见稿)》解读
8月3日,依据《中华人民共和国个人信息保护法》等法律法规,国家互联网信息办公室起草了《个人信息保护合规审计管理办法(征求意见稿)》(下文简称“办法”),并向社会公开征求意见。 据悉ÿ…...
南大通用数据库-Gbase-8a-学习-37-delete误删数据恢复方法
一、前提 在delete误删数据之后,没有再对此表进行其他ddl、dml和load等操作,可以使用手动切换AB版本的方式来进行数据恢复。 二、环境 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数…...
【高光谱图像的去噪算法】通过全变异最小化对受激拉曼光谱图像进行去噪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
UEditorPlus v3.3.0 图片上传压缩重构,UI优化,升级基础组件
UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符…...
百度翻译API整合SpringBoot
案例背景,按照官方给的Demo,实在是太啰嗦了, 大致步骤 封装数据>签名>发送请求, 仔细一看劈里啪啦一大堆,最后还要手动关流关连接,难道整合到SpringBoot项目里面我还得为内存管理考虑 所以就有了如下需求 使用 RestTemplate的对象进行发送请求数据,RestTemplate由s…...
Spring @Primary、@Order、JSR @Priority作用与区别
前言 Primary、Order、Priority三个注解很常见,关于它们的异同,这里做个总结。 Primary、Order、Priority Primary Spring Primary控制注入优先级。 Order Spring Order控制注入到List中的排序,值越小优先级越高,不能是负数&am…...
【Mac】mac 系统下格式化U盘或移动硬盘为ext4格式
1. 打开终端,安装 homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2. 安装之后再次运行此命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"…...
ubuntu20.4 sgx环境配置
一、driver安装 1.在该下载地址将3个.bin文件下载下来,下载地址:https://download.01.org/intel-sgx/latest/linux-latest/distro/ubuntu20.04-server/ 2.到下载文件夹下输入下面命令,以赋予.bin文件的执行权限 sudo chmod 777 sgx_linux_x64…...
01.图片下拉触底分页加载每张图片
需求点分析 图片列表滚动触底的逻辑 将图片id组成的一维数组根据指定个数一组拆分为二维数组定义一个索引初始值为-1,图片列表滚动触底,索引值自增,然后将拆分好的图片id二位数组对应的数据读出来放到图片id的数组图片根据列表新增的id取读取…...
“精准学习嵌入式开发:明确目标,提升技能“
嵌入式领域涵盖广泛,不可能一次性掌握所有知识。因此,明确学习目标和方向非常重要。选择感兴趣且与职业发展相关的领域进行深入学习是明智之举。 嵌入式技术在不断发展,过去与现在存在差异。选择学习当前行业的主流技术和趋势是明智选择。掌…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
