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

问题

我有一个使用Java 7编写的旧应用程序。它在Java 8 JRE中运行良好。我不打算重写任何代码来使用Java 8功能。将已编译的代码升级到最新的Java 8 JDK有什么技术上的好处吗?

为了清楚起见,代码目前使用Java 7编译,并且已经使用最新的Java 8 JRE运行。它应该已经从Java 8运行时改进中受益。这个问题是通过编译版本8和运行Java 8编译的字节代码是否可以获得任何好处。

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


#1 热门回答(81 赞)

如果我正确理解了这个问题,你想知道javac产生的字节码在Java 8中是否比在Java 7中"更好"。

答案可能不是,他们不断修复编译器中的错误,有时会导致更高效的字节码。但据我所知,你不会从Java 8的这些修复中看到任何显着的加速,changelog只列出版本之间的两个主要变化。

oracle网站很糟糕,我似乎无法获得与版本之间的javac相关的错误修正列表,但是here is a non exhaustive one from OpenJDK。我能找到的大多数都是修复错误。因此,通过更新到Java 8,有可能它不再编译,因为3650014557更正确地遵循JLS并且字节码将很少甚至没有"改进"。


#2 热门回答(22 赞)

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

此外,如果你要在Java 8 JVM上运行代码,你可能只安装了一个版本的Java。

Java 8可能更快,并且它更好地支持G1等新功能。但是,对于你的用例可能会更慢,因此唯一的方法是测试它。

将已编译的代码升级到最新的Java 8 JDK有什么技术优势吗?

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

唯一微妙的区别是Java API存在细微差别,因此Java 8编译器可能会发现Java 7的细微差别

其他细微差别是文件开头的幻数,可能是常量池的顺序。字节代码基本相同,甚至支持invokedynamic,这是为Java 7中存在的lambdas添加的,但只是没有那样使用。


#3 热门回答(21 赞)

它可以通过创造意识来帮助。

切换到Java8时,你可能会发现javac发出的其他警告。示例:类型推断已经通过Java8得到了很大改进。这可以消除当前代码库中对@SuppressWarnings注释的需求(当不再需要这样的注释时,编译器就会发出警告)。

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

另一方面:

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

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