首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java 8编译代码与java 11编译代码

java 8编译代码与java 11编译代码
EN

Stack Overflow用户
提问于 2020-10-06 19:05:13
回答 1查看 1.6K关注 0票数 3

我们目前有用Java 8编译的代码,但是我们正在Java11VM上运行它。现在,我们也在尝试将代码移到Java 11编译时。想知道Java 8编译代码与Java 11编译代码是否有什么好处,因为这两种编译器都会产生不同的类文件(字节码)?在效率方面,两者有何不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-07 00:56:40

javac不是优化编译器,所以一般来说,不要期望它从一个版本到另一个版本生成“更快”的字节码。优化是JVM的一项工作。

同时,Java确实支持新的语言特性,并且可能支持新的JVM特性。其中一些确实对性能有影响。JDK9-JDK11中最值得注意的例子如下。

  1. JEP 280: Indify字符串连接 (JDK 9)。 此JEP更改字符串连接表达式的编译方式。在JDK 9之前,字符串+表达式被转换为 新StringBuilder().append()...append().toString(); 虽然JIT承认这些链并试图在运行时优化它们,但是这种优化是脆弱的,并不总是像预期的那样工作。将字符串与invokedynamic连接在一起可以使JVM有更多的自由来生成更好的代码。您可以在这个JEP的备注中找到详细的解释和基准测试。
  2. 9月181:基于巢的访问控制 (JDK 11) 这个JEP解决了访问嵌套类的私有成员的问题。在JDK 11之前,Java为它们生成了合成桥方法(示例)。 乍一看,这与性能无关。然而,在边缘案例中,由于衬砌深度的限制,一种额外的合成方法可能会破坏衬里。 基于嵌套的访问控制允许嵌套类在没有合成桥的情况下访问彼此的私有成员,从而降低意外性能下降的风险。

更新

以前,我在这个列表中包括了JDK-8175883:用于增强循环的字节码生成,但是正如@Holger在评论中注意到的那样,这种“优化”实际上并不有效。

结论

Java编译器的变化主要与新的语言/JVM特性有关。字节码级优化不是目标。然而,其中一些变化也可能(间接)影响性能。无论如何,重新编译代码可能带来的性能好处非常小,以至于在实际应用程序中您甚至都不会注意到它们。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64232267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档