深入拆解 Java 虚拟机
郑雨迪
Oracle 高级研究员,计算机博士
87446 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
模块四:黑科技 (3讲)
深入拆解 Java 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

29 | 基准测试框架JMH(下)

防止即时编译器优化
控制即时编译
校验程序状态
初始化程序状态
粒度
程序状态的定义
缺陷
算法
预热迭代和测试迭代的配置
配置性能数据的格式
提升性能数据的准确度
保证相对干净的虚拟机环境
Fork出新的Java虚拟机
实践环节
功能回顾
Blackhole类
@CompilerControl
@Setup和@TearDown
@State
稳定状态检测
稳定状态
区分预热迭代和测试迭代
@BenchmarkMode
@Fork
参考文章
总结与实践
即时编译相关功能
@State、@Setup和@TearDown
@Warmup和@Measurement
@Fork和@BenchmarkMode
基准测试框架JMH

该思维导图由 AI 生成,仅供参考

今天我们来继续学习基准测试框架 JMH。

@Fork 和 @BenchmarkMode

在上一篇的末尾,我们已经运行过由 JMH 项目编译生成的 jar 包了。下面是它的输出结果:
$ java -jar target/benchmarks.jar
...
# JMH version: 1.21
# VM version: JDK 10.0.2, Java HotSpot(TM) 64-Bit Server VM, 10.0.2+13
# VM invoker: /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: org.sample.MyBenchmark.testMethod
# Run progress: 0,00% complete, ETA 00:08:20
# Fork: 1 of 5
# Warmup Iteration 1: 1023500,647 ops/s
# Warmup Iteration 2: 1030767,909 ops/s
# Warmup Iteration 3: 1018212,559 ops/s
# Warmup Iteration 4: 1002045,519 ops/s
# Warmup Iteration 5: 1004210,056 ops/s
Iteration 1: 1010251,342 ops/s
Iteration 2: 1005717,344 ops/s
Iteration 3: 1004751,523 ops/s
Iteration 4: 1003034,640 ops/s
Iteration 5: 997003,830 ops/s
# Run progress: 20,00% complete, ETA 00:06:41
# Fork: 2 of 5
...
# Run progress: 80,00% complete, ETA 00:01:40
# Fork: 5 of 5
# Warmup Iteration 1: 988321,959 ops/s
# Warmup Iteration 2: 999486,531 ops/s
# Warmup Iteration 3: 1004856,886 ops/s
# Warmup Iteration 4: 1004810,860 ops/s
# Warmup Iteration 5: 1002332,077 ops/s
Iteration 1: 1011871,670 ops/s
Iteration 2: 1002653,844 ops/s
Iteration 3: 1003568,030 ops/s
Iteration 4: 1002724,752 ops/s
Iteration 5: 1001507,408 ops/s
Result "org.sample.MyBenchmark.testMethod":
1004801,393 ±(99.9%) 4055,462 ops/s [Average]
(min, avg, max) = (992193,459, 1004801,393, 1014504,226), stdev = 5413,926
CI (99.9%): [1000745,931, 1008856,856] (assumes normal distribution)
# Run complete. Total time: 00:08:22
...
Benchmark Mode Cnt Score Error Units
MyBenchmark.testMethod thrpt 25 1004801,393 ± 4055,462 ops/s
在上面这段输出中,我们暂且忽略最开始的 Warning 以及打印出来的配置信息,直接看接下来貌似重复的五段输出。
# Run progress: 0,00% complete, ETA 00:08:20
# Fork: 1 of 5
# Warmup Iteration 1: 1023500,647 ops/s
# Warmup Iteration 2: 1030767,909 ops/s
# Warmup Iteration 3: 1018212,559 ops/s
# Warmup Iteration 4: 1002045,519 ops/s
# Warmup Iteration 5: 1004210,056 ops/s
Iteration 1: 1010251,342 ops/s
Iteration 2: 1005717,344 ops/s
Iteration 3: 1004751,523 ops/s
Iteration 4: 1003034,640 ops/s
Iteration 5: 997003,830 ops/s
你应该已经留意到Fork: 1 of 5的字样。这里指的是 JMH 会 Fork 出一个新的 Java 虚拟机,来运行性能基准测试。
之所以另外启动一个 Java 虚拟机进行性能基准测试,是为了获得一个相对干净的虚拟机环境。
在介绍反射的那篇文章中,我就已经演示过因为类型 profile 被污染,而导致无法内联的情况。使用新的虚拟机,将极大地降低被上述情况干扰的可能性,从而保证更加精确的性能数据。
在介绍虚方法内联的那篇文章中,我讲解过基于类层次分析的完全内联。新启动的 Java 虚拟机,其加载的与测试无关的抽象类子类或接口实现相对较少。因此,具体是否进行完全内联将交由开发人员来决定。
关于这种情况,JMH 提供了一个性能测试案例[1]。如果你感兴趣的话,可以下载下来自己跑一遍。
除了对即时编译器的影响之外,Fork 出新的 Java 虚拟机还会提升性能数据的准确度。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JMH基准测试框架是一个重要的性能测试工具,本文介绍了其核心概念和使用方法。首先,通过Fork创建干净的虚拟机环境以确保性能数据准确性。文章还讲解了预热迭代和测试迭代的区别,以及如何配置迭代次数和持续时间。另外,提到了吞吐量和平均时间等不同格式的性能数据输出方式。文章还介绍了@State、@Setup和@TearDown注解的使用方法,以及即时编译相关功能和实践建议。总的来说,本文通过实际代码和输出结果的解释,帮助读者了解了JMH基准测试框架的核心概念和使用方法,为他们进行性能测试提供了指导和参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Java 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 永烁星光
    老师 @State注解 这个程序状态类 实在没有看懂,其用处在于什么?
    2018-10-12
    2
  • the geek
    看网上其他文章,都是说@State注解是用来设置标注类的实例范围。性能测试类由JMH管理,和spring的@Scope注解相似。
    2020-02-10
  • 随心而至
    动手做一遍,感受会更深些
    2019-10-29
  • cras
    需要那些基础知识才听得懂老师的内容?
    2019-09-08
    1
  • neohope
    建议老师给一个更贴合生产环境的例子,比如用JMH测试SpringBoot RestController的性能,可能效果会更好一些?
    2019-09-07
  • HELSING
    郑老师,能不能介绍一下,为什么ZGC会快那么多啊
    2018-09-26
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部