Java基准测试工具JMH详解
Java基准测试工具JMH详解
- 1.JMH概述
- 1.1 JMH简介
- 1.2 JMH与JMeter区别
- 1.3 JMH注解说明
- 2.JMH验证
- 2.1 创建项目
- 2.2 引入依赖
- 2.3 启动异常解决
- 2.4 JMH案例
1.JMH概述
1.1 JMH简介
JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM.
JMH是一种Java工具,用于构建、运行和分析用Java和其他针对JVM的语言编写的nano/micro/mili/macro基准测试。
JMH 是 OpenJDK 团队开发的一款基准测试工具,一般用于代码的性能调优,精度甚至可以达到纳秒级别,适用于 java 以及其他基于 JVM 的语言。和 Apache JMeter 不同,JMH 测试的对象可以是任一方法,颗粒度更小,而不仅限于rest api。
官方地址:http://openjdk.java.net/projects/code-tools/jmh/
官网案例:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
1.2 JMH与JMeter区别
JMeter更多是对rest api接口进行压测,可以通过设置参数编写脚本实现模拟并发场景进行单模块或者是整个链路进行压测。
而JMH关注的是某一段代码或者是某个方法在jvm中执行的效率,颗粒度更细,可以使用 JMH 对优化的效果进行定量的分析。
1.3 JMH注解说明
在运行时,注解配置被用于解析生成BenchmarkListEntry配置类实例。
一个方法对应一个@Benchmark注解,一个@Benchmark注解对应一个基准测试方法。
注释在类上的注解,或者注释在类的字段上的注解,则是类中所有基准测试方法共用的配置。
@Benchmark声明一个public方法为基准测试方法。
@BenchmarkMode通过JMH我们可以轻松的测试出某个接口的吞吐量、平均执行时间等指标的数据(假设我想测试testGson方法的平均耗时,那么可以使用@BenchmarkMode注解指定测试维度为Mode.AverageTime。)
@Measurement测量次数
@Measurement假设我想测量testGson方法五次,那么可以使用@Measurement注解。
@Warmup配置预热参数。
为了数据准确,我们可能需要让testGson方法做下热身运动。如在方法中创建GsonParser对象,预热可以避免首次创建GsonParser时因多了类加载的耗时而导致测试结果不准备的情况。jvm使用JIT即时编译器,一定的预热次数可让JIT对testGson方法的调用链路完成编译,去掉解释执行对测试结果的影响。
@OutputTimeUnit
OutputTimeUnit注解用于指定输出的方法执行耗时的单位。如果方法执行耗时为秒级别,为了便于 观察结果,我们可以使用@OutputTimeUnit指定输出的耗时时间单位为秒;如果方法执行耗时为毫秒级别,为了便于观察结果,我们可以使用@OutputTimeUnit指定输出的耗时时间单位为毫秒,否则使用默认的秒做单位,会输出10的负几次方这样的数字,不太直观。
@Fork用于指定fork出多少个子进程来执行同一基准测试方法。假设我们不需要多个进程,那么 可以使用@Fork指定为进程数为1。
@Threads注解用于指定使用多少个线程来执行基准测试方法,如果使用@Threads指定线程数为2,那么每次测量都会创建两个线程来执行基准测试方法。
2.JMH验证
2.1 创建项目
创建一个基准测试项目,基本的Maven项目引入jmh依赖,jmh包括两部分jmh-core与jmh-generator-annprocess。
2.2 引入依赖
<!--JMH-->
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.33</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess -->
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.33</version><scope>provided</scope>
</dependency>
2.3 启动异常解决
关于JMH运行ERROR: transport error 202: connect failed: Connection refused ERROR解决。
网上有很多说法,又是插件引入,又是idea配置,实际上你应该是启动的debug模式,换成run模式就行。
2.4 JMH案例
/*** JMH案例1** @author zrj* @since 2021/10/9**/
public class JMHSample_01_HelloWorld {@Benchmark@BenchmarkMode(Mode.Throughput)@Warmup(iterations = 3)@Measurement(iterations = 3, time = 5, timeUnit = TimeUnit.SECONDS)@Threads(1)@Fork(1)@OutputTimeUnit(TimeUnit.SECONDS)public void wellHelloThere() throws InterruptedException {Thread.sleep( 1000 );}/*** JMH的基础配置* include:benchmark所在类的名字,可以使用正则表达* warmupIteration:预热的迭代次数,这里为什么要预热的原因是由于JIT的存在,随着代码的运行,会动态对代码的运行进行优化。因此在测试过程中需要先预热几轮,让代码运行稳定后再实际进行测试* measurementIterations:实际测试轮次* output:测试报告输出位置,不配置则输出到控制台。*/public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include( JMHSample_01_HelloWorld.class.getSimpleName() ).forks( 1 ).build();new Runner( opt ).run();}
}
Java基准测试工具JMH详解相关推荐
- Java诊断工具Arthas详解
Arthas Arthas 是 Alibaba 开源的 Java 诊断工具 作用 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 ...
- 基准测试神器JMH——详解36个官方例子
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 简介 基准测试是指通过设计科学的测试方法.测试工具和测试系统,实现对一类测试对象的某项性能指标 ...
- 消除冗长Java代码的工具——Lombok详解
消除冗长Java代码的工具--Lombok详解 文章目录 消除冗长Java代码的工具--Lombok详解 什么是Lombok Lombok的作用 Lombok常用注解 Lombok安装 什么是Lomb ...
- Java单元测试之JUnit4详解
2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- 13.5.虚拟化工具--jhat详解、13.6.虚拟化工具--jstack详解
13.5.虚拟化工具–jhat详解 一般不通过这个命令执行,而是通过图形化工具类查看jvm信息. 在页面下有: 查看什么是OQL语句 在页面上有OQL help,可以查看OQL的语法. 13.6.虚拟 ...
- 13.4.虚拟化工具--jmap详解
13.4.虚拟化工具–jmap详解 13.4.1.jmap命令基本概述 13.4.2.命令格式 13.4.3.参数说明 13.4.虚拟化工具–jmap详解 13.4.1.jmap命令基本概述 jmap ...
- 13.3.虚拟化工具--jinfo详解
13.3.虚拟化工具–jinfo详解 实时查看和调整虚拟机的各项参数. jinfo命令可以用来查看java进程运行的JVM参数,命令如下: [root@admin ~]# jinfo --help U ...
- Java中JDBC连接数据库详解
今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...
最新文章
- 简述Intel的MESI缓存一致性协议
- ORACLE复合索引使用 注意事项
- netty系列之:netty中的ByteBuf详解
- 不止代码 洛谷P1006 传纸条(dp)
- ulead gif animator_搞笑GIF趣图:这风看来很大啊,今天回不来家了7
- linux c mysql 增删改查_Linux C语言连接MySQL 增删改查操作
- 一个很好用的JavaScript的文件上传插件plupload
- 深度学习知识点全面总结
- 怎样通过微PE工具箱制作启动盘?
- Microsoft Visio 2016 专业版
- [两道递推题] 美团 CodeM 初赛 Round A 二分图染色 OEIS A001499
- iPhone越狱cydia源大全
- 美图秀秀api实现图片的裁剪及美化
- 3.5 计算机网络之介质访问控制(静态划分信道、FDM、TDM、STDM、WDM、CDM)、(动态划分信道、ALOHA、CSMA、CSMA/CD、CSMA/CA)、令牌传递协议
- awesome-adb
- 5G标准设立 智慧城市还有哪四大挑战?
- windows10 RocketMQ启动 mqbroker 异常
- Word编辑技巧(图片、文本框居中)
- python箭头符号怎么打_python – 箭头的Matplotlib图例
- PalmOS开发教程-7
热门文章
- 计算机杀检测防护报告,最新杀毒软件测试报告
- HTML5和CSS3三自定义播放器
- Android源码完全解析——View的Measure过程
- app store未能找到使用指定主机名的服务器
- 人工智能助力金融贷款提高销售业绩
- 劳易测测距传感器ODS9L2.8/LAK-650-M12
- 8、ByteBuffer(方法演示2(allocate堆内存和allocateDirect直接内存))
- win7计算机找不到clsid,win7系统提示windows找不到文件的解决方法
- 全面拥抱 K8s,ApacheDolphinScheduler 应用与支持 K8s 任务的探索
- 计算机应用数学基础,《计算机应用数学基础》冯天祥 编_孔网