代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

26 | 有哪些招惹麻烦的性能陷阱?

一起来动手
撞车的哈希值
遗漏的hashCode
未关闭的资源
内存的泄露
字符串的操作
使用性能测试工具
性能陷阱

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

前面,我们讨论了改善代码性能的最基本的办法。接下来,我们讨论一些最佳实践,让我们先从一些容易被忽略的性能陷阱开始。

使用性能测试工具

今天我们的讲解需要用到一个工具,它就是 JMH。JMH 是为 Java 语言或者其他基于 JVM 的编程语言设计的一个基准测试工具。这一节,我们会使用这个工具来分析一些性能的陷阱。这里我们简单地介绍下,这个工具该怎么使用。
第一步,使用 Maven 工具建立一个基准测试项目(需要使用 Maven 工具):
$ mvn archetype:generate \
-DinteractiveMode=false \
-DarchetypeGroupId=org.openjdk.jmh \
-DarchetypeArtifactId=jmh-java-benchmark-archetype \
-DgroupId=com.example \
-DartifactId=myJmh \
-Dversion=1.0
这个命令行,会生成一个 myJmh 的工程目录,和一个基准测试模板文件(myJmh/src/main/java/com/example/MyBenchmark.java)。通过更改这个测试模板,就可以得到你想要的基准测试了。
比如,你可以使用后面我们用到的基准测试代码,替换掉模板中的基准测试方法(measureStringApend)。
package com.example;
import org.openjdk.jmh.annotations.Benchmark;
public class MyBenchmark {
@Benchmark
public String measureStringApend() {
String targetString = "";
for (int i = 0; i < 10000; i++) {
targetString += "hello";
}
return targetString;
}
}
第二步,编译基准测试:
$ cd myJmh
$ mvn clean install
第三步,运行你的基准测试:
$ cd myJmh
$ Java -jar target/benchmarks.jar
稍微等待,基准测试结果就出来了。我们需要关注的是"Score"这一栏,它表示的是每秒钟可以执行的基准测试方法的次数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了常见的性能陷阱及其解决方案,重点介绍了使用性能测试工具JMH进行性能分析的方法。通过具体的基准测试和分析,文章展示了字符串操作的高效实现方式,以及频繁的对象创建、销毁对代码效率的影响。此外,还探讨了内存泄漏、资源未关闭、hashCode遗漏和哈希值撞车等问题,并提出了解决方案和最佳实践建议。通过对Java中常见性能问题的深入剖析,读者可以更好地理解和解决类似问题。文章还鼓励读者利用JMH工具分析更多性能问题,并提供了练手题以及改进方案的思路。总的来说,本文为读者提供了实用的性能优化建议,帮助他们更好地理解和解决性能陷阱问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 熊猫
    老师,能推荐JMH快速入门的博客吗?减少大家查找信息成本。

    作者回复: 可以参考下面的链接。https://openjdk.java.net/projects/code-tools/jmh/ http://tutorials.jenkov.com/java-performance/jmh.html https://blog.goyello.com/2017/06/19/testing-code-performance-jmh-tool/ https://www.baeldung.com/java-microbenchmark-harness 其中,第一个链接里,还可以深入看一下JMH官方的例子: https://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ 中文的,请参考: http://blog.dyngr.com/blog/2016/10/29/introduction-of-jmh/ https://www.xncoding.com/2018/01/07/java/jmh.html

    2019-05-22
    6
  • 夕夏洛克
    老师这是我用jmh 跑出的性能数据 为什么 string的性能是最好的呢 MyBenchmark.stringMethod thrpt 25 15.036 ± 1.045 ops/s MyBenchmark.stringBufferMethod thrpt 25 7689.300 ± 367.812 ops/s MyBenchmark.stringBuilderMethod thrpt 25 7690.659 ± 251.793 ops/s

    作者回复: 首先要点赞动手使用JMH测试代码性能,这就迈开了步子,这一步最难的。 测试代码什么样的?使用的是文章中的代码吗?数据是每秒执行操作数,越大越好。

    2019-03-06
    4
  • 空知
    @夕夏洛克 查了下 JMH有四种模式,Throughput是吞吐量,单位时间内处理请求数,越大越好, 注解@BenchmarkMode(Mode.Throughput)可以修改模式
    2019-03-07
    3
  • ifelse
    生命周期长的集合,是 Java 容易发生内存泄漏的地方。--记下来
    2022-07-26
  • 往事随风,顺其自然
    存在拆箱和装箱的转换问题,比较耗费资源
    2019-03-05
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部