首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JMH -为什么JIT没有消除我的死代码

JMH是Java Microbenchmark Harness的缩写,是一个专门用于进行Java微基准测试的工具。它提供了一种简单且可靠的方式来测量和评估Java代码的性能。

JIT(Just-In-Time)编译器是Java虚拟机(JVM)中的一部分,它将Java字节码实时编译为本地机器码,以提高程序的执行效率。JIT编译器通过分析代码的执行情况来进行优化,其中包括消除死代码(Dead Code Elimination)。

然而,有时候JIT编译器可能无法完全消除死代码的原因可能有以下几点:

  1. 代码的执行路径不确定:在某些情况下,代码的执行路径可能是动态的,无法在编译时确定。这可能导致JIT编译器无法准确地判断哪些代码是死代码。
  2. 代码的副作用:即使某段代码看起来没有实际的输出或结果,但它可能具有副作用,例如修改全局变量或触发异常。JIT编译器为了保证程序的正确性,可能会保留这些代码。
  3. 代码的可见性:JIT编译器只能对可见的代码进行优化。如果某段代码只在特定条件下才会执行,而这些条件在编译时无法确定,那么JIT编译器可能无法消除这些代码。

总的来说,JIT编译器尽最大努力来消除死代码,但由于编译器的工作原理和代码的特性,无法保证完全消除所有死代码。在进行性能优化时,开发人员可以通过手动优化代码结构、减少不必要的计算和条件判断等方式来帮助JIT编译器更好地消除死代码。

关于JMH和JIT编译器的更多信息,您可以参考腾讯云的相关产品和文档:

  1. JMH产品介绍:https://cloud.tencent.com/product/jmh
  2. JIT编译器优化技术:https://cloud.tencent.com/document/product/213/2170
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JAVA拾遗 — JMH与8个代码陷阱

使用 JMH 解决 12 个测试陷阱 陷阱1:消除 ?...这是由于 JIT 擅长删除“无效”代码,这给我们测试带来了一些意外,当你意识到 DCE 现象后,应当有意识去消费掉这些孤立代码,例如 return。JMH 不会自动实施对冗余代码消除。...消除这个概念很多人其实并不陌生,注释代码,不可达代码块,可达但不被使用代码等等,这里补充一些 Aleksey 提到概念,用以阐释为何一般测试方法难以避免引用对象发生死码消除现象: Fast...很绝望,个人水平有限,没能 get 到这些点,只能原封不动地贴给大家看了。 JMH 提供了专门 API — Blockhole 来避免消除问题。...这个图可供我们提出两个问题: 为什么 2 线程 -> 4 线程几乎没有变化? 为什么 2 线程相比 1 线程只有 1.87 倍变化,而不是 2 倍? 1 电源管理 ?

1.5K40

JMH-基准测试框架

通常用于代码性能调优,JMH开发者同样为JIT开发者,得益于专业JVM优化分析,JMH具有高精度特点,适用于Java及基于JVM语言。...# JMH-避免代码消除陷阱 The downfall of many benchmarks is Dead-Code Elimination (DCE): compilers are smart...引用官方解释: 许多基准测试失败是因为代码消除(DCE),因为编译器足够聪明,可以推断出一些计算是冗余并完全消除掉他们,如果被淘汰部分是基准测试代码,那将引起基准测试失败(不准确) 代码陷阱一个典型场景如下...Math.log(x); } } 上述代码采用void进行返回,使得变量x结果并没有被用到,JVM优化时会将整个方法内部代码移除。...JMH提供了2种方式避免该问题: 将变量作为方法返回值,即此时方法返回double,return Math.log(x) 通过JMHBlackhole consume避免JIT优化消除 通过JMH插件创建

85130
  • 性能调优必备利器之 JMH

    该工具是由 Oracle 内部实现 JIT 大牛们编写,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试影响。...预热目的是让 JVM 对被测代码进行足够多优化,比如,在预热后,被测代码应该得到了充分 JIT 编译和优化。...比如 JIT 优化中消除,比如以下代码: @Benchmark public void testStringAdd(Blackhole blackhole) { String a = ""...; for (int i = 0; i < length; i++) { a += i; } } JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole consume 来避免 JIT 优化消除

    52210

    性能调优必备利器之 JMH

    该工具是由 Oracle 内部实现 JIT 大牛们编写,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试影响。...预热目的是让 JVM 对被测代码进行足够多优化,比如,在预热后,被测代码应该得到了充分 JIT 编译和优化。...比如 JIT 优化中消除,比如以下代码: @Benchmark public void testStringAdd(Blackhole blackhole) { String a = ""...; for (int i = 0; i < length; i++) { a += i; } } JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole consume 来避免 JIT 优化消除

    53820

    性能调优必备利器之 JMH

    该工具是由 Oracle 内部实现 JIT 大牛们编写,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试影响。...预热目的是让 JVM 对被测代码进行足够多优化,比如,在预热后,被测代码应该得到了充分 JIT 编译和优化。...比如 JIT 优化中消除,比如以下代码: @Benchmark public void testStringAdd(Blackhole blackhole) { String a = ""...; for (int i = 0; i < length; i++) { a += i; } } JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole consume 来避免 JIT 优化消除

    1.1K20

    代码模板 | 代码没有else

    嗯,代码没有else系列,一个设计模式业务真实使用golang系列。 ? 前言 本系列主要分享,如何在我们真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套总结使用设计模式四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 通过历史上接触过各种抽奖场景(红包雨、糖果雨、打地鼠、大转盘(九宫格)、考眼力、...------------ //代码没有`else`系列 //模板模式 //@auhtor TIGERB //------------------...//------------------------------------------------------------ //代码没有`else`系列 //模板模式 //@auhtor TIGERB...代码没有`else`,只是一个在代码合理设计情况下自然而然无限接近或者达到结果,并不是一个硬性目标,务必较真。 2.

    1K30

    代码组件 | 代码没有else

    嗯,代码没有else系列,一个设计模式业务真实使用golang系列。 ? 前言 本系列主要分享,如何在我们真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套总结使用设计模式四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 按照如上某东订单结算页面的示例,我们得到了如下订单结算页面模块组成图: ?...----------------------- //代码没有`else`系列 //组合模式 //@auhtor TIGERB //-------...代码没有`else`,只是一个在代码合理设计情况下自然而然无限接近或者达到结果,并不是一个硬性目标,务必较真。 2....---- 代码没有else系列 更多文章 代码模板 | 代码没有else 链式调用 | 代码没有else 点击https://github.com/TIGERB/easy-tips/tree

    1.2K10

    Java基准测试工具JMH使用

    大家好,又见面了,是你们朋友全栈君。 JMH,即Java Microbenchmark Harness,这是专门用于进行代码微基准测试一套工具API。...to Chart转化方法从而支持更多图表 JMH Visualizer:它是一个功能齐全可视化项目,只是少了想要图表罢了。...比如 JIT 优化中消除,比如以下代码:@Benchmark public void testStringAdd(Blackhole blackhole) { String a = “”;...for (int i = 0; i < length; i++) { a += i; } }JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉,这就会影响测试结果...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole consume 来避免 JIT 优化消除

    54110

    基准测试神器JMH —— 详解36个官方例子

    为什么需要 有人可能会说,可以在代码前后打点计算代码运行时间,为什么还需要JMH?...本例主要介绍了一个知识点:Dead-Code Elimination (DCE) ,即死码消除,文档上说编译器非常聪明,有的代码没啥用,就在编译器被消除了,但这给我做基准测试带了一些麻烦,比如上面的代码中...,baseline 和 measureWrong 有着相同性能,因为编译器觉得 measureWrong这段代码执行后没有任何影响,为了效率,就直接消除掉这段代码,但是如果加上return语句,就不会在编译期被去掉...(9)JMHSample09Blackholes 本例是为了解决(8)中消除问题,JMH提供了一个 Blackholes (黑洞),这样写就不会被编译器消除了。 ?...(21)JMHSample21ConsumeCPU 本例介绍了Blackhole另一种用法,前面提到Blackhole可以用来干掉“消除”,同时Blackhole也可以“吞噬”cpu时间片(怪不得起这个名字

    2.3K22

    为什么HibernateDaoSupport没有注入SessionFactory

    前言 很早之前,就打算写这一篇文章了(其实有很多源码分析文章打算写,但是自己太拖延了导致很多文章搁浅了)。为什么要写这一文章呢?...事情缘由是同事在SpringBoot项目中有一个A类继承HibernateDaoSupport,但是程序运行总是抛出没有成功注入SessionFactory错误,后来debug Spring源码解决了这个问题...这个错误原因是A类RootBeanDefinition中autowireMode值为0,在AbstractAutowireCapableBeanFactory类中populateBean方法中没有执行到...autowireByName(beanName, mbd, bw, newPvs),导致SessionFactory属性没有注入成功。...beanFactory)方法中不要使用beanFactory.getBean()会造成类性早熟,最终后果就是类中一些属性没有成功注入。

    3.1K10

    链式调用 | 代码没有else

    嗯,代码没有else系列,一个设计模式业务真实使用golang系列。 ? 前言 本系列主要分享,如何在我们真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套总结使用设计模式四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 步骤 逻辑 1 参数校验 2 获取地址信息 3 地址信息校验 4 获取购物车数据 5...代码demo package main //--------------- //代码没有`else`系列 //责任链模式 //@auhtor TIGERB<https://github.com/...代码没有`else`,只是一个在代码合理设计情况下自然而然无限接近或者达到结果,并不是一个硬性目标,务必较真。 2....---- 代码没有else系列 更多文章 代码模板 | 代码没有else 点击https://github.com/TIGERB/easy-tips/tree/master/go/src/patterns

    1.7K40

    订阅通知 | 代码没有else

    嗯,代码没有else系列,一个设计模式业务真实使用golang系列。 ? 前言 本系列主要分享,如何在我们真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套总结使用设计模式四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 注:本文于单体架构背景探讨业务实现过程,简单容易理解。...代码demo package main //------------------------------------------------------------ //代码没有`else`系列...代码没有`else`,只是一个在代码合理设计情况下自然而然无限接近或者达到结果,并不是一个硬性目标,务必较真。 2....---- 代码没有else系列 更多文章 代码模板 | 代码没有else 链式调用 | 代码没有else 代码组件 | 代码没有else 点击https://github.com/

    1.8K20

    客户决策 | 代码没有else

    嗯,代码没有else系列,一个设计模式业务真实使用golang系列。 ? 前言 本系列主要分享,如何在我们真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套总结使用设计模式四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 我们以某团订单支付页面为例,页面上每一个支付选项都是一个支付策略。...------------ //代码没有`else`系列 //策略模式 //@auhtor TIGERB //------------------...代码没有`else`,只是一个在代码合理设计情况下自然而然无限接近或者达到结果,并不是一个硬性目标,务必较真。 2....---- 代码没有else系列 更多文章 代码模板 | 代码没有else 链式调用 | 代码没有else 代码组件 | 代码没有else 订阅通知 | 代码没有else

    91420

    聊聊springboot项目如何利用jmh来进行基准测试

    预热,可用于类或者方法上由于JVM会使用JIT对热点代码进行编译,因此同一份代码可能由于执行次数增加而导致执行时间差异太大,因此我们可以让代码先预热几轮,预热时间不算入测量计时。...@Setup: 用于基准测试前初始化动作,只能用于方法@TearDown 用于基准测试后执行,主要用于资源回收,只能用于方法4、JMH陷阱常见比如消除。...所谓码,是指注释代码,不可达代码块,可达但不被使用代码等等。...因此,JVM可以完全取消a+b计算。它被认为是代码。JVM然后可以检测到sum变量从未被使用,并且随后a和b也从未被使用。他们也可以被淘汰。...consume 来避免 JIT 优化消除

    17910

    JMH简介

    大家好,又见面了,是你们朋友全栈君。   JMH是新microbenchmark(微基准测试)框架(2013年首次发布)。...与其他众多框架相比它特色优势在于,它是由Oracle实现JIT相同人员开发。特别是想提一下Aleksey Shipilev和他优秀博客文章。...) 冗余代码 冗余代码消除是microbenchmark中众所周知问题。...通常解决方法是以某种方式使用计算结果。JMH本身不会实施对冗余代码消除。但是如果你想消除冗余代码——要做到测试程序返回值不为void。永远返回你计算结果。JMH将完成剩余工作。...JIT非常聪明,在循环中经常出现不可预料处理。要测试真实计算,让JMH处理剩余部分。

    1.7K20

    JITLogCompilation

    简介 我们知道在JVM中为了加快编译速度,引入了JIT即时编译功能。那么JIT什么时候开始编译,又是怎么编译,作为一个高傲程序员,有没有办法去探究JIT编译秘密呢?...根据上面的介绍,我们现场来生成一个JIT编译日志,为了体现出专业性,这里我们需要使用到JMH来做性能测试。...之前有的朋友说,代码也用图片,看起来好看,从本文之后,我们会尽量把代码也转成图片来展示: ? 看完JMH介绍,上面的例子应该很清楚了,主要就是做一个累加操作,然后warmup 5轮,测试5轮。...在@Fork注解里面,我们可以配置jvm参数,为什么注释掉了呢?因为发现在jvmArgsPrepend中-XX:LogFile是不生效。 没办法,只好在运行配置中添加: ?...总结 复杂编译日志终于讲完了,可能讲并不是很全,还有一些其他情况这里并没有列出来,后面如果遇到了,再添加进去。

    86731

    不曾忘记初心-愿天堂没有代码

    已经过去4年了,q群里已经有1年没人在里面聊天了,他还在,大家总会想起他,看过第一篇“不曾忘记初心-10年”文章朋友, 应该记得2011年进入了通行行业公司,在那里认识了一位鹏飞兄弟,当时是负责带一个...2015年春节初四,迪迪在群里说鹏飞已经走了,对于鹏飞一直感觉是个迷,怎么这么快,至到2017年4月去北京出差,在西直门见到迪迪。...离开病房那一刻迪迪和胖孩抱在一起哭了,没有想到一起来北京成为北漂他们,战友变成了这样。...2015年春节大年初4迪迪给鹏飞父母打了个电话,谁知道当天凌晨鹏飞已经离开了人世。说到这里迪迪又哭了,眼泪也掉了下来。北漂难道就这么难?...其实在写这篇文章时候征求了迪迪意见,他建议不加这句话,会影响你阅读和转发,很多人朋友圈里面都有自己领导和老板,但是对迪迪说,难道员工身体好不是公司财富吗,码农定位并不是要让自己当码农,

    86830

    不要再用main方法测试代码性能了,用这款JDK自带工具

    预热主要让JVM对被测代码进行足够多优化,比如JIT编译器优化。...这是因为JIT编译器进行了优化,比如当JVM发现在测试当中StringBuffer并没有发生逃逸,于是就进行了锁消除操作。 常用注解 下面对JHM当中常用注解进行说明,以便大家可以更精确使用。...对于每个@Benchmark方法使用一个独立进程可以解决这个问题,这也是JMH默认选项。注意不要设置为0,设置为n则会启动n个进程执行测试(似乎也没有太大意义)。...注意事项 无用代码消除(Dead Code Elimination) 现代编译器是十分聪明,它们会对代码进行推导分析,判定哪些代码是无用然后进行去除,这种行为对微基准测试是致命,它会使你无法准确测试出你方法性能...JMH提供了两种方式避免这种问题,一种是将这个变量作为方法返回值return a,一种是通过Blackholeconsume来避免JIT 优化消除

    43310
    领券