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


127

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

需要明确的是,该代码当前是使用Java 7编译的,并且已经与最新的Java 8 JRE一起运行。它应该已经从Java 8运行时改进中受益。问题是,使用版本8进行编译并使用Java 8编译的字节码运行是否会获得任何好处。


另外,我也不关心开发人员生产率之类的非技术利益。我认为这些很重要,但不是这个问题的重点。我要的是没有开发团队的生产代码。它完全处于维护模式。


2
只是要清楚。该代码已经与最新的1.8 JRE一起运行,因此(据我所知)具有所有最新的Java 8错误修复和运行时性能改进。
g8torPaul

4
这可能是一个有关编译器输出的字节码的更多问题。也许在您的问题中更清楚一点。
M Platvoet

2
因此,提高开发人员的生产力与这里无关吗?
米克助记键

7
我不敢相信“我不打算重写任何代码”怎么办。
Eldo

Answers:


82

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

答案可能不是,它们会不断修复编译器中的错误,有时会导致更高效的字节码。但就我所知,您不会看到这些针对Java 8的修补程序的任何重大改进,该变更日志仅列出了两个版本之间的两个主要变更。

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


4
谢谢,我已经查看了OpenJDK上的一些列表,除了看起来似乎已经提高了Javac的性能外,没有什么真正突出的。我同意在Oracle网站上几乎不可能对Java版本之间的修复程序/功能进行合理的搜索。每个版本的发行说明的格式甚至不一致。我的直觉告诉我,使用JDK 8和JDK 7进行编译没有技术上的好处
。– g8torPaul

1
@ g8torPaul,除非您要使用仅Java 8中可用的功能,例如lamdbas / streams
Peter Lawrey

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中也存在对lambda 的支持,但并不是那样使用的。


8
如果我错了,请纠正我,但是OP会询问如何使用Java 8重新编译代码,而您的答案是是否要使用Java 8来执行它?
tobias_k

5
我目前正在最新的Java 1.8 JRE下运行。JRE将提供所有错误修复和内部Java代码。我认为这不能解决我的问题。
g8torPaul

16
这根本不能回答问题。如果“几乎没有”,请说明区别。否则,它只是投机
中号Platvoet

1
@Peter Lawrey,您说“ ..答案是;几乎什么都没有”。我们是否有证据支持这一点?顺便说一句,我倾向于同意你的看法。
g8torPaul

2
@ g8torPaul Java 8被设计为与Java 7向后兼容,如果您不使用Java 8的任何功能,它将产生几乎完全相同的字节码。
彼得·劳瑞

21

它可以通过提高认识来帮助。

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

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

另一方面:

  • 我在这里看到一些有关Java8拒绝编译Java7代码的罕见情况的问题。因此,切换到Java8还带来了(最小)陷入此类问题的风险。
  • 并且:即使您今天不打算接触您的代码库,以后仍有一定机会改变主意。然后,在不注意的情况下,您可以利用Java8功能。这可能会使“现场更新”复杂化;因为您现在要维护两个版本的源代码!
  • 然后:如果您有客户使用java7 jre运行产品;您必须非常谨慎对待提供给它们的二进制修复程序。我们有这样的设置;而且我浪费了一次以上的时间,因为我不小心将一个Java8编译的类放到了Java7驱动的测试系统上。当您的开发人员和测试/客户设置全部为Java7时,这根本不可能发生。

长话短说:有一些微妙的优势和某些风险(其中风险的重要性主要取决于您的总体设置)。


2
这样的罕见“ Java8拒绝编译Java7”问题的一个示例:stackoverflow.com/q/41590024/2513200(Oracle编译器的已知问题仅影响Java 8,而没有影响Java 7或9)
Hulk

8

至少会为这些事实做。

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

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

3)G1垃圾收集器

编辑

从技术角度来看,这听起来更像是与“ 提前编译”有关的事情,或者听起来像是编译器可能会通过对代码的更多分析来改进的事情。据我所知,这些事情不是在Java 8编译器中完成的。

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

编辑2

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

–参数

保留方法参数名称。

-个人资料

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


26
难道不只是 在Java 8下运行还可以带来这些好处?真正的问题似乎是,“我可以用Java 8编写比Java 7更好的东西吗”。
乔恩·弗妮

8
我目前正在最新的Java 1.8 JRE下运行。JRE将提供所有错误修复和内部Java代码。垃圾收集器也是JRE的一部分。我认为这不能解决我的问题。
g8torPaul

8
@JornVernee OP明确表示他不想重写任何内容,因此据我所知,这个问题更像是“ Java 8编译器可以做Java 7编译器不能做的任何
trick俩

2
@JornVernee问题是,如果用Java 7编写并用Java 8编译的代码执行得更好,则用Java 7编译的代码执行得更好
EarlGrey

6
没有回答这个问题,只是推测它没有改善。
M Platvoet

-1

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

但是,如果您只需要重新编译一次,请考虑以下事项:

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

总之,如果不需要,请不要重新编译它。但是,第一次,您必须重新编译(由于代码更改),切换到Java8。不要因为环境不匹配而冒犯错误的风险,也不要无缘无故地限制开发人员。


第二个要点不正确。您的帖子在某些方面是自相矛盾的。
罗恩侯爵

@EJP第二个要点是我的更多经验,但是您是否有一个示例可以在JDK 8中进行-source 7编译,而不能进行编译-source 8?另外,请您指出矛盾之处,因为您的评论本身并不是很有建设性的……
Didier L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.