如果从源角度保持不变(java 8)在Java 11上运行,从性能角度重新编译具有新目标版本(java 11)的项目是否有意义?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
在较新的JVM上运行Java 8字节码有什么陷阱?
更新:
代码优化器是编译阶段的阶段之一,其中:
更多:https://www.guru99.com/compiler-design-phases-of-compiler.html
所以,我想知道不同的编译器(基准)之间是否有很大的区别,如果能在编译阶段获得所有优化的完整列表,将是一件很好的事情
不,javac
编译器没有进行太多优化,因为JIT在运行时负责大多数优化,因此您将获得完全相同的字节码。除了该类文件将被标记为Java 11之外,因此您将无法在较低版本上运行它。
Java是向后兼容的,因此在较新版本上运行Java 8字节码没什么特别的。
当然,在较新的JVM上运行Java 8字节码可以(可能)在JIT中使用改进的动态优化,因此,仅使用较新的JVM而无需进行任何其他编译,您更有可能获得改进的性能。
正如Johannes的video所示,总是有兴趣针对内存和速度来优化String,因为它们是Java项目中最常用的对象。但是,它仍然是一个微基准,大多数区别来自使用Java 11编译和运行的代码与使用Java 8编译和运行的代码。
我试图找到可以解决recompilation的资源,但很快就找不到任何东西。因此,直到有证据表明非微基准技术将从recompilation到Java 11字节码受益(现实,而不是理论上),我将其分类为“ Performance Voodoo”。