繁体   English   中英

使用OpenJDK编译的Java代码是否将始终在Oracle的Hotspot上运行,反之亦然?

[英]Will java code compiled using OpenJDK always run on Oracle's Hotspot or vice versa?

我浏览了该文档 ,在Oracle JDK中编译了相同的Java代码,而在OpenJDK上则没有。 关于相同问题的一些参考文献也出现在SO上 这是否意味着"javac"是特定于供应商的?

如果答案是肯定的? 那么它们可能会产生不同的字节码。 请参考这里

因此,如果字节码不同,那么Oracle的JVM将如何处理OpenJDK的javac生成的字节码?

可以肯定地说: “ Java是“一次编写即可在任何地方运行”,只要javac编译器和JVM来自同一供应商?

javac不是特定于供应商的,但是不同的编译器可能会有不同的错误,这可能会导致差异。

更重要的是可用的内置库,特别是开发人员不打算使用的esp类。 例如,直到Oracle JDK中的Java 6更新18,sun.misc.Unsafe.copyMemory(5 args)才存在,并且仅在OpenJDK的最新更新中可用。 AFAIK,它在IBM JVM中不可用。

一次写入,可在任何地方运行意味着一次编译,可在任何地方运行。 例如,只要为每个系统重新编译C ++,就可以编写一次,并且可以在任何地方运行。

编译Java代码后,它将在具有您使用的库的任何系统上运行。

使用OpenJDK编译的Java代码是否将始终在Oracle的Hotspot上运行,反之亦然?

如果它们是相同版本,则是。

但是,如果您在Java 7上编译并尝试在Java 6或更早版本上运行,则会遇到问题(除非您适当地使用-target开关)。

不同版本的Java之间,Java语言和Java编译器对JLS的解释也有所不同。 但是这些差异通常会导致编译错误,而不是导致不同的代码。


实际上,OpenJDK和Oracle JDK非常接近。 实际上,对于匹配的版本,我希望各个javac编译器生成的字节码实际上是相同的。 当然,对一个代码库进行的编译器错误修复将移植到另一个代码库,并且字节码编译器中的代码生成错误非常少见。 生成的字节码中的其他差异(即不是由于错误)不太可能影响正确编写的程序的行为。


可以肯定地说:“ Java是“一次编写即可在任何地方运行”,只要javac编译器和JVM来自同一供应商?

嗯...不 不同平台的Java行为有所不同。 即Windows上的Java和Linux上的Java在某些方面表现不同。 其中一些差异直接归因于平台本身。 例如,在Windows和Linux上,路径名语法和文件锁定是不同的。 其他原因则是由于从Java到平台的不同本机窗口系统的映射问题。

这些差异与编译器或代码生成无关。

最好的答案是“取决于情况”。 生成不同的字节码不一定会生成错误的字节码。 请记住,您参考的第一个文档是关于OpenJDK 6和Oracle JDK 6的。那时,OpenJDK和Oracle JDK实际上常常是微妙的不兼容,因为Oracle并未像使用JDK 7那样将两个JDK项目整合在一起。现在它们几乎是相同的代码库,但在7之前不是这种情况。

坐在用OracleJDK编译的jar文件上,该文件在该系统上运行。 当我尝试在安装了OpenJDK的情况下在我的计算机上运行它时,它拒绝运行。 并且不断给我一个缺少的类错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM