使用新版本的JavaVM优化来编译具有向后兼容性的java类



我想知道,当编译为java 1.4编写的java源代码时,-source和-target开关设置为1.4,是否会使用内置在两者之间的版本中的某些/任何优化。我的第一个意图是说当然不会,因为在编译之后,您会得到一组指令,这些指令的目标是原始的1.4 VM。然后我认为,既然编译器只是更聪明地使用指令,应该还有一些改进。

或者换句话说,大多数优化是在运行代码或编译类的VM中进行的吗?

请将1.4的评论保存为无可救药的过时,这个问题只是我想了两天的事情,现在搜索互联网并没有为我提供任何合理的好答案。

认为javac编译器优化代码是一个常见的误解。在99%的情况下,它不会这样做,并且大多数情况下会将您所写的内容翻译为字节码。

所有的优化都在运行时的JIT中。这意味着在JDK 1.0上编译的代码将在最新的处理器上运行,与在Java 7或8的最新更新上编译的相同代码一样有效。

注意:编译器在计算编译时已知的常量时做了少量优化。例如,1+1 => 2, "hello " + "world" => "hello world"。这些优化多年来没有太大变化,它们在Java 1.2中就存在了,可能更早。

编译

时,你会得到一组指令,这些指令的目标是原始的1.4 VM

在Java 7中只添加了一个字节代码指令,因为Java 1.0和Java不使用它。添加它是为了支持在JVM上运行的动态语言。

在运行代码或编译类的VM中执行最多的优化

你可以假设它是。Java 1.0 - 1.4将使用StringBuffer进行字符串连接,而Java 5.0+将使用稍微优化的StringBuilder。差异非常小(但可测量)

请保存1.4已经过时的评论,

Java 6已经过时了,Java 8将使Java 7看起来非常过时(当它最终在今年某个时候发布时)

如果您将目标指定为特定的jdk版本,那么生成的字节码将不会被优化,但是,如果您碰巧在更高级的vm中运行这个类文件/jar,那么它将更快地执行JIT编译和其他优化。平台特定的优化将在VM端完成,因为更改字节码将导致UnsupportedClassVersionError。

最新更新