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

时间:2017-02-02 14:09:30

标签: java performance java-8

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

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

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

5 个答案:

答案 0 :(得分:81)

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

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

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

答案 1 :(得分: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的细微差别

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

答案 2 :(得分:21)

通过创建意识可以提供帮助。

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

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

另一方面:

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

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

答案 3 :(得分:8)

我愿意至少这些事实。

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

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

3)G1垃圾收集器

编辑

从技术角度来看,这听起来更像是与 Ahead of Time Compilation 或编译器可能通过更多地分析代码而改进的东西。据我所知,这些东西都没有在java 8编译器中完成。

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

编辑2

我只知道与您的第二个查询匹配的两个点:

  

α参数

保留方法参数名称。

  

-profile

称为精简配置文件选项,占用空间更小。

答案 4 :(得分:-1)

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

但是,如果你只需要重新编译一次,请考虑一下:

  • 您的应用程序源代码与Java 7兼容,很可能也是8;
  • 如果代码无法使用Java 8进行编译,则可能无法使用Java 7源代码模式中的Java 8编译器进行编译(-source 7使用javac);
  • 您的开发人员和CI需要针对Java 8运行时运行单元和集成测试,以尽可能接近生产环境。开发人员还需要在本地运行时在同一Java 8运行时运行该应用程序;
  • 使用JDK 7编译并使用JRE 8(在相同的构建过程中,或在同一个IDE中)运行比使用相同版本的所有内容更难;
  • 如果使用JDK 8编译并且目标运行时是Java 8,则使用-source 7而不是-source 8没有任何好处;
  • 使用-source 8保证开发人员使用Java 8(或更高版本)进行编译和运行时(因为它强制执行-target 8)。

总之,如果您不需要,请不要重新编译它。但是,在第一次需要重新编译时(由于代码更改),请切换到Java 8.不要因为环境不匹配而冒险出错,并且不要在没有安装的情况下限制开发人员。很有道理。