性能文章>升级到JDK9的一个BUG,你了解吗>

升级到JDK9的一个BUG,你了解吗原创

1年前
7027110

概述

前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果存在记得立马改过来。

image.png

输出比较有意思,在JDK9以前,只输出一个evaluated,但是JDK9以后的版本却会输出两个evaluated,大家可以测试一下。

猜想

看到这个现象,大家都开始猜测了

首先,到底是编译期问题还是运行时问题?这个好验证,我们用JDK8编译的class分别跑在JDK8和JDK10上,看是不是也有类似的现象。

其次,如果是编译期问题,那到底差异在哪里,从结论看,用JDK10编译的字节码,test方法肯定能执行两次。

大家验证下来发现第一种情况没发生类似的问题了,那基本确定是第二种情况,那接下来简单分析下。

简单分析

验证字节码,我们都是通过javap去看的,javap -verbose JavacEvalBug,两个版本下我们分别看到下面的字节码

JDK8编译的字节码

image.png

其实基本相当于如下的逻辑

image.png

JDK10编译的字节码

image.png

粗看已经比较明了了,在JDK10编译的字节码里我们确实看到执行了两次test方法,那就和结论比较匹配了。

这个Bug已经有人汇报给Oracle了,https://bugs.openjdk.java.net/browse/JDK-8204322
大家可以关注下。

思维发散

上面其实都是涉及到了字符串拼接,JDK9以前用的是StringBuilder来拼接的,而JDK9开始使用了invokeDynamic指令,可以动态指定要调用的方法,而不是一开始就编译好的,这个展开来讲就比较长了,有兴趣的可以网上找点资料了解一下,我有时间也可以专门写篇相关的文章,只是感觉对这块有比较大兴趣或者有兴趣一直读下去的的估计不会太多。

改下Demo让你再惊喜一下

如果上面的Demo改一下,把数组变成int数组

image.png

此时你再试试?

分类:
标签:
请先登录,再评论

感谢
/storage/emulated/10/sogou/GlideCache/b98dd27f4eb540c8e53639bb8d68b0ced8d34319d9863adece8d9ce0c8dbfe82.0

1年前

为你推荐

不起眼,但是足以让你收获的JVM内存案例
今天的这个案例我觉得应该会让你涨姿势吧,不管你对JVM有多熟悉,看到这篇文章,应该还是会有点小惊讶的,不过我觉得这个案例我分享出来,是想表达不管多么奇怪的现象请一定要追究下去,会让你慢慢变得强大起来,
字符串字面量长度是有限制的
前言 偶然在一次单元测试中写了一个非常长的字符串字面量。 正文 在一次单元测试中,我写了一个很长的字符串字面量,大概10万个字符左右,编译时,编译器给出了异常告警 `java: constant
多次字符串相加一定要用StringBuilder而不用-吗?
今天在写一个读取Java class File并进行分析的Demo时,偶然发现了下面这个场景(基于oracle jdk 1.8.0_144): ``` package test; public c
如何通过反射获得方法的真实参数名(以及扩展研究)
前段时间,在做一个小的工程时,遇到了需要通过反射获得方法真实参数名的场景,在这里我遇到了一些小小的问题,后来在部门老大的指导下,我解决了这个问题。通过解决这个问题,附带着我了解到了很多新的知识,我觉得
谨防JDK8重复类定义造成的内存泄漏
概述 如今JDK8成了主流,大家都紧锣密鼓地进行着升级,享受着JDK8带来的各种便利,然而有时候升级并没有那么顺利?比如说今天要说的这个问题。我们都知道JDK8在内存模型上最大的改变是,放弃了Perm
JDK13 GA发布:5大特性解读
JDK13 GA版本 5大新特性如下: 350: Dynamic CDS Archives 351: ZGC: Uncommit Unused Memory 353: Reimplement the
译:谁是 JDK8 中最快的 GC
我们都知道 OpenJDK8 有好几个垃圾回收算法,比如 ParallelGC,CMS,还有 G1,那么哪个才是最快的?如果 GC 算法从 Java8 中默认的 ParallelGC 切换到 G1 会
Javassist实现JDK动态代理
提到JDK动态代理,相信很多人并不陌生。然而,对于动态代理的实现原理,以及如何编码实现动态代理功能,可能知道的人就比较少了。接下一来,我们就一起来看看JDK动态代理的基本原理,以及如何通过Javass