龙游县住房和城乡建设局网站/网站优化塔山双喜
这段时间接手项目出现各种问题,令人不胜烦扰。吐槽下公司做项目完全靠人堆,大上快上风格注定留下一地鸡毛,修修补补不如想如何提升同事代码水准免得背锅。偶然看到关于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取读取…...

“精准学习嵌入式开发:明确目标,提升技能“
嵌入式领域涵盖广泛,不可能一次性掌握所有知识。因此,明确学习目标和方向非常重要。选择感兴趣且与职业发展相关的领域进行深入学习是明智之举。 嵌入式技术在不断发展,过去与现在存在差异。选择学习当前行业的主流技术和趋势是明智选择。掌…...

C语言--联合体-共用体
有时候同一个内存空间存放类型不同,不同类型的变量共享一块空间 像结构体,但是有区别 1、 结构体元素有各自单独空间, 共用体元素共享空间,空间大小由最大类型确定 同一块空间,有时候存放char类型、有时候存放int型&am…...

echarts实现中国地图下钻进入下一级行政区(地图钻取)
获取geo数据: 可以使用node爬虫获取数据 最好多爬几遍,因为有时候会获取错误 实现逻辑 拥有geo数据后 请求geo数据注册地图 registerMap配置echarts增加事件监听(点击事件) 如果点击了,回到第一步。功能就是循环以…...

从0到1学会手写操作系统,我只用了2个小时
黑马嵌入式教程再出力作 重磅发布第三弹 《自己动手写嵌入式操作系统》 问:嵌入式开发不是只学单片机就行?为什么要学操作系统? 答:年轻人,别把路走窄了。且听我说↓↓↓ 嵌入式产品分为两大类:一类简单…...

软件包管理
一、rpm管理软件包 1、获得rpm的软件包 1)去官网安装不推荐 找自己光盘有没有这个包 装好需要的包之后装qq 2)去镜像站点,推荐 二、yum/dnf管理软件包 解决软件的依赖关系,可以自动的去服务器下载软件包 1、使用yum软件包 使用…...

【逗老师的PMP学习笔记】9、项目资源管理
目录 一、规划资源管理1、【关键工具】责任分配矩阵RACI矩阵2、【关键工具】组织理论2.1、马斯洛需求层次理论2.2、麦格雷戈-X-Y理论2.3、赫兹伯格双因素理论 3、【关键输出】资源管理计划4、【关键输出】团队章程 二、估算活动资源1、【关键输入】资源日历 三、获取资源1、【关…...

react-virtualized可视化区域渲染的使用
介绍 github地址:https://github.com/bvaughn/react-virtualized 实例网址:react-virtualized如果体积太大,可以参考用react-window。 使用 安装: yarn add react-virtualized。在项目入口文件index.js中导入样式文件ÿ…...

navicat连接postgresql报错
navicat连接postgresql报错 navicat连接postgresql报错 现象 有小伙伴告诉我 安装了新的postgresql 使用navicat连接,报错 ERROR: column "datlastsysoid" does not existLINE 1: SELECT DISTINCT datlastsysoid FROM pg database column “datlastsy…...

题目:灾后重建
【题目描述】 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车ÿ…...

Vue 插槽 slot
solt 插槽需要分为 2.6.0 版本以上和 2.6.0版本以下。 2.6.0 版本以下的 slot 插槽在,2.x版本将继续支持,但是在 Vue 3 中已被废弃,且不会出现在官方文档中。 作用 插槽 prop 允许我们将插槽转换为可复用的模板,这些模板可以基于…...

【C/C++】C语言位图操作实例(亲测)
C语言中的位图操作通常用于处理大量的二进制数据,例如图像处理、压缩算法等。以下是一些C语言中的位图操作实例: 设置位图中的某一位 void set_bit(unsigned char *bitmap, int bit) {bitmap[bit / 8] | (1 << (bit % 8)); }这个函数将位图中的第…...