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

g8t*_*aul 127 java performance java-8

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

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


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

And*_*rew 82

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

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

oracle网站很糟糕,我似乎无法获得与javac版本之间相关的错误修正列表,但这里有一个来自OpenJDK的非穷举.我能找到的大多数都是修复错误.因此,通过更新到Java 8,由于javac更加正确地遵循JLS,它有可能不再编译,并且字节码几乎没有"改进".

  • 谢谢,我已经回顾了OpenJDK上的一些列表,除了看起来它们已经改善了javac的性能之外没有什么真正突出.我同意在Oracles网站上对Java版本之间的修复/功能进行合理搜索几乎是不可能的.每个版本的发行说明的格式甚至不一致.我的直觉告诉我,使用JDK 8和JDK 7进行编译没有技术上的好处. (4认同)

Pet*_*rey 21

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

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

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

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

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

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

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

  • 这根本不回答这个问题.如果它"几乎没有"请说明不同之处.否则它只是猜测 (16认同)
  • 如果我错了,请纠正我,但是OP要求用Java 8重新编译代码,而你的答案是关于是否使用Java 8执行它? (8认同)
  • 我目前在最新的Java 1.8 JRE下运行.所有错误修复和内部Java代码都将由JRE提供.我不认为这解决了我的问题. (5认同)
  • @ g8torPaul Java 8旨在向后兼容Java 7,如果您不使用Java 8的任何功能,它应该生成几乎完全相同的字节代码. (2认同)

Gho*_*ica 21

通过创造意识可以提供帮助.

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

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

另一方面:

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

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

  • 这种罕见的"Java8拒绝编译Java7"问题的一个例子:http://stackoverflow.com/q/41590024/2513200(Oracle编译器的一个已知问题仅影响Java 8,但不是7或9) (2认同)

Eug*_*ene 8

我会为至少这些事实做些什么.

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

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

3)G1垃圾收集器

编辑

从技术角度来看,这听起来更类似于时间前期编译或编译器可能通过更多地分析代码而改进的东西.据我所知,这些东西都没有在java 8编译器中完成.

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

编辑2

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

α参数

保留方法参数名称.

-轮廓

称为紧凑型材选件,占地面积更小.

  • 不仅仅是Java 8下的_running_已经提供了这些好处吗?真正的问题似乎是,"我能用Java 8编写一些比Java 7更好的东西". (26认同)
  • 我目前在最新的Java 1.8 JRE下运行.所有错误修复和内部Java代码都将由JRE提供.垃圾收集器也是JRE的一部分.我不认为这解决了我的问题. (8认同)
  • @JornVernee OP明确表示他不想重写任何东西,所以我理解的问题更像是"Java 8编译器可以做Java 7编译器无法做到的任何技巧" (8认同)
  • 不回答问题,只是推测它没有改善. (6认同)
  • @JornVernee问题是,如果使用Java 7编写并在Java 8中编译的代码执行得更好,那么在Java 7中编译的代码 (2认同)