将Java 7编译代码升级到Java 8有什么好处吗?

我有一个使用Java 7编写的旧应用程序。它在Java 8 JRE中运行良好。 我不打算重写任何代码来使用Java 8function。 将编译代码升级到最新的Java 8 JDK是否有任何技术优势?

清楚的是,这些代码目前使用Java 7进行编译,并且已经与最新的Java 8 JRE一起运行。 它应该已经从Java 8运行时改进中受益。 这个问题是通过编译版本8并使用Java 8编译的字节码运行是否会有好处。


另外,我不关心开发人员的生产力等非技术性好处。 我认为这些是重要的,但不是这个问题的重点。 我要求的是没有开发团队的生产代码。 纯粹处于维护模式。

如果我正确地理解了这个问题,你想知道在java 8中生成的字节码在Java 8中比在Java 7中是“更好的”。

答案可能不是,他们经常修正编译器中的错误,有时会导致更高效的字节码。 但是,就我所见,从Java 8的这些修复程序中不会看到任何显着的加速, 更改日志只列出了两个版本之间的主要更改。

甲骨文的网站是可怕的,我似乎无法得到与版本之间的javac相关的错误修正列表,但这是从OpenJDK不完全的一个 。 我可以find的大部分是修复错误。 所以通过更新到Java 8,有一个机会不会因为javac更正确地遵循JLS而进行javac ,并且对字节码的“改进”很less或没有改进。

最主要的好处是,Java 8具有最新的错误修复,因为Java 7没有被公开更新。

另外,如果您要在Java 8 JVM上运行代码,那么您可能只安装了一个Java版本。

Java 8可能会更快,并且更好地支持像G1这样的新function。 但是,对于您的用例来说可能会比较慢,因此唯一的方法就是testing它。

将编译代码升级到最新的Java 8 JDK是否有任何技术优势?

如果您问在Java 8编译器中重新编译Java 7代码是否有任何好处,答案是: 几乎没有。

唯一的区别是Java API有一些细微的差别,所以Java 8编译器可能会发现Java 7

其他细微差别是文件开始处的幻数,可能是常量池的顺序。 字节码基本上是一样的,甚至支持在Java 7中为lambdas添加的invokedynamic ,但是没有被使用。

它可以通过build立意识来帮助。

当您切换到Java8时,您可能会发现由javac发出的其他警告。 例子:用Java8, types推断已经有了很大的改进。 这可以消除在当前代码库中对@SuppressWarnings注释的需求(当不再需要这种注释时,编译器会警告)。

所以,即使你今天不打算修改你的代码库,切换到Java8也可以告诉你这些事情。 增加你的知识可以帮助做出明智的决定。

另一方面:

  • 我在这里看到了一些关于Java8拒绝编译Java7代码的情况(罕见)的问题。 所以,切换到Java8也带来了(最小的)遇到这种问题的风险。
  • 而且:即使你今天不打算接触你的代码库,以后有可能改变你的想法。 然后,当不注意的时候,你可能会利用Java8的特性。 这可能使“现场更新”复杂化; 因为你现在有两个版本的源代码来维护!
  • 那么:如果你有客户使用java7 jre运行产品; 你必须非常小心你给他们的二进制修复。 我们有这样的设置; 而且我不止一次地浪费了时间,因为我不小心把一个Java8编译的类放到了Java7驱动的testing系统上。 当你的开发和testing/客户设置都是Java7时,这根本就不会发生。

长话短说:有一些微妙的优势,还有一些风险(风险的重要性主要取决于你的整体设置)。

至less会这样做。

1)HashMap内部(在jdk-8下更快)

2)修复了许多可能对您而言透明的错误(运行时优化),这些错误会使您的代码更快,更好,而无需执行任何操作。

3)G1垃圾收集器

编辑

从技术angular度来看,这听起来更像是“时间编译前”或者编译器可能通过更多地分析代码而改进的东西。 据我所知这样的事情不是在java 8编译器中完成的。

从开发人员的angular度来看 – 有很多。 提高生产力对我来说是最重要的。

编辑2

我知道只有两个点匹配你的第二个查询:

α参数

保存方法参数名称。

-profile

称为紧凑型configuration选项 ,占地更小。

如果你没有其他的理由来重新编译你的应用程序,那么它可能没有太大的区别,正如接受的答案所述。

但是,如果您必须重新编译一次,请考虑这一点:

  • 您的应用程序源代码与Java 7兼容,最有可能的是8;
  • 如果代码不能用Java 8进行编译,则可能无法使用Java 7源代码兼容模式下的Java 8编译器进行编译( -source 7 with javac);
  • 您的开发人员和CI将需要对Java 8运行时运行单元和集成testing,以尽可能接近生产环境。 在本地运行时,开发人员还需要在同一个Java 8运行时上运行应用程序;
  • 使用JDK 7进行编译并且使用JRE 8(在相同的构build过程中,或者在同一个IDE中)比使用相同版本进行编译更加困难;
  • 如果使用JDK 8编译并且目标运行时为Java 8,则使用-source 7而不使用-source 7是没有好处的;
  • 使用-source 8确保开发人员使用Java 8(或更高版本)编译和运行时(如执行-target 8 )。

总之,不要重新编译它,如果你不需要。 但是,首先必须重新编译(由于代码更改),请切换到Java 8.不要冒着由于环境不匹配而导致错误的风险,也不要在没有充分理由的情况下限制开发人员。