使用向后兼容性编译的java类是否使用较新版本的Java VM优化?

时间:2013-04-26 08:30:02

标签: java performance compiler-construction runtime

我想知道,当编译为java 1.4编写的java源并且-source和-target开关设置为1.4时,是否会使用版本中内置的一些/任何优化。我的第一个目的当然不是说,因为在编译之后你会获得一组指令,这些指令的目标是最初的1.4 VM。然后我认为,由于编译器只是更巧妙地使用指令,因此仍然应该有一些改进。

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

请保存评论1.4并无可救药地过时,这个问题简直就是我现在想了两天,在网上搜索并没有为我提供任何合理的答案。

2 个答案:

答案 0 :(得分:6)

javac编译器优化代码是一种常见的误解。它不是在99%的情况下,并且主要产生你写的字节代码的字面翻译。

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

注意:编译器在计算编译时已知的常量时会进行少量优化。例如1+1 => 2和"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看起来过时(当它最终在今年某个时候出现时)

答案 1 :(得分:-1)

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