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没办法用,只能各位自行探索了

 

 

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

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

相关文章

【JavaScript】jquery的导入方式有两种:本地导入和线上导入

前言 jQuery是一个用来代替JavaScript来快捷书写前端脚本语言的库,jQuery可以大大的简化复杂的js代码,使开发人员专注于实现页面的效果。 导入方式有两种 jQuery的导入方式有两种,一种是本地导入,一种是利用超链接导入。 方法…

SpringBoot 整合MyBatis

整合MyBatis 官方文档:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ Maven仓库地址:https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter/2.1.3 整合测试 导入 MyBatis 所需要的…

Python数据分析案例03——天气K均值聚类分析

聚类常用的算法肯定是K均值聚类了,本次案例采用陕西的十个地区的天气数据,构建特征,进行聚类分析。 首先数据都装在‘天气数据’这个文件夹里面,如图: 打开其中一个excel,长这个样子 下面开始数据处理 数据…

Django实现音乐网站 ⑼

使用Python Django框架制作一个音乐网站, 本篇主要是后台对专辑、首页轮播图原有功能的基础上进行部分功能实现和显示优化。 目录 专辑功能优化 新增编辑 专辑语种改为下拉选项 添加单曲优化显示 新增单曲多选 更新歌手专辑数、专辑单曲数 获取歌手专辑数 保…

07-2_Qt 5.9 C++开发指南_二进制文件读写(stm和dat格式)

文章目录 1. 实例功能概述2. Qt预定义编码文件的读写2.1 保存为stm文件2.2 stm文件格式2.3 读取stm文件 3. 标准编码文件的读写3.1 保存为dat文件3.2 dat文件格式3.3 读取dat文件 4. 框架及源码4.1 可视化UI设计4.2 mainwindow.cpp 1. 实例功能概述 除了文本文件之外&#xff…

MGRE综合

实验 一、实验思路 1.先按照上图配置IP地址及环回 2.写缺省使公网可通 3.让R1、R4、R5每台路由器均成为中心站点形成全连网状结构拓扑 4.让R1成为中心站点R2R3为分支站点 5.分区域宣告ospf之后更改ospf在虚拟接口Tunnel工作方式为broadcast及让R1 当选DR 二、上虚拟机操作…

数字万用表测量基础知识--DMM的显示位数

概览 DMM(即数字万用表)是一种电气测试和测量仪器,可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 DMM的显示位数 数字万用表(DMM)可用于进行各种测量。在选择DMM或理解所使用的DMM时,首…

改进的麻雀算法优化最大相关峭度解卷积(SCSSA-MCKD),实现早期微弱故障诊断,MATLAB代码实现

01 引言 由于一些设备的早期故障产生的冲击十分微弱,易被系统噪声干扰,如何有效地对设备的原始故障信号进行降噪并增强信号中微弱冲击成分,是进行该类部件早期故障诊断的关键。 最大相关峭度解卷积(MCKD)通过解卷积运算…

Kotlin读写分离CopyOnWriteArrayList

Kotlin读写分离CopyOnWriteArrayList 基于读写分离思想Copy-On-Write(COW)设计的线程安全ArrayList变体,读读共享、写写互斥、读写互斥、写读互斥。读时直接读,不用加锁同步,线程安全。写/删/修改数据时复制一个副本,在新的List副…

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

手把手推导扩散模型:Diffusion Models(DDPM) DDPM理论回顾前置知识过程详解Forward ProcessReverse Process DDPM算法伪代码训练部分采样部分 总结一下 参考链接 在这篇博客文章中,我们将深入研究 去噪扩散概率模型(也称为 DDPM&…

Linux Linux系统文件类型与文件权限

一、文件类型 (1)在windows系统中文件类型以文件的后缀名来区分,在Linux系统中文件类型不以后缀名来区分。注意编写c代码时必须写后缀名.c,不然C编译器不会编译该文件。 (2)在Linux系统中以文件的标志来区…

如何用SOLIDWORKS Simulation 避免共振现象

零件都有它的固有振动频率,称之为共振频率。当零部件的固有频率和激励频率相近时,对零部件的破坏是非常严重的,这就是我们说的共振。频率分析是设计师日常工作常见的设计验证。 今天给大家分享的是Simulation的频率分析操作方法: …

Linux配置QT Creator环境:ubuntu中安装QT Creator环境

一、前景 目前市面上很多公司使用QT Creator进行界面开发,基本都会选择在Linux环境进行,优点不仅是市场所需,更是方便后期代码的移植,相较于Windows系统,Linux系统移植性非常好。故此篇文章,介绍如何在Linu…

【深度学习注意力机制系列】—— CBAM注意力机制(附pytorch实现)

CBAM(Convolutional Block Attention Module)是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主…

在工作中使用ChatGPT需要担心泄密问题吗?

​OpenAI的ChatGPT可以通过自动简化繁琐的任务,针对挑战性问题的提供创造性的解决方案来提高员工的生产力。但随着这项技术被整合到人力资源平台和其他工作场所中,它给各个企业带来了巨大的挑战。苹果、Spotify、Verizon和三星等大公司已禁止或限制员工在…

CC++内存管理

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻c内存管理方式new/delete 操作内置类型new和delete操…

Java开发要学哪些知识点?建议收藏

随着信息技术的快速发展,Java语言技能成为了企业招聘市场上最受欢迎的技能之一。在这样的市场需求下,Java开发也成为了很多人想要掌握的基本技能之一。那么,我们在学习Java开发时,应当掌握哪些知识点呢?下面,小编将为…

htmlCSS-----案例展示

目录 前言 作品效果 html代码 CSS代码 图片资源 前言 在学习html过程中我们要试着去写写一些案例,通过这些案例让我们更加熟悉代码以及丰富我们的经验,下面是我个人写的一个案例,代码和图片也给出了大家,你们可以参考参考。…

(贪心) 剑指 Offer 14- I. 剪绳子 ——【Leetcode每日一题】

❓剑指 Offer 14- I. 剪绳子 难度:中等 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n > 1 并且 m > 1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m…

IDEA的实用快捷键大全

目录 1.常规快捷键 1.1通用类 1.2注释类 1.3操作类 1.4展开与关闭 2.智能补全类快捷键 3.程序结构类快捷键 4.统一操作快捷键 1.常规快捷键 1.1通用类 像 Ctrl C 复制, Ctrl V 粘贴, Ctrl S保存文件, Ctrl X剪切,这种…