使用OpenJDK编译的java代码是否总是在Oracle的Hotspot上运行,反之亦然?

时间:2013-11-28 14:20:12

标签: java jvm javac openjdk

我来了这个document,其中相同的Java代码在Oracle JDK中编译,但在OpenJDK上编译。存在针对相同问题的一些参考文献here too on SO。 这是否意味着"javac"是特定于供应商的?

如果答案是肯定的?然后他们有可能产生不同的字节码。 Refer here

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

安全地说:“Java is”Write Once and Run Anywhere,前提是javac编译器和JVM来自同一个供应商? “

4 个答案:

答案 0 :(得分:6)

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

更有意义的是可用的内置库,开发人员不打算使用的esp类。例如sun.misc.Unsafe.copyMemory(5 args)在Oracle JDK中的Java 6更新18之前不存在,并且仅在OpenJDK的上次更新中可用。 AFAIK,它在IBM JVM中不可用。

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

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

答案 1 :(得分:1)

  

使用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映射到平台的不同本机窗口系统的问题。

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

答案 2 :(得分:1)

你的问题的最佳答案是“这取决于”。生成不同的字节码不一定会产生错误的字节码。请记住,您引用的第一个文档正在讨论OpenJDK 6和Oracle JDK 6.当时,OpenJDK和Oracle JDK实际上经常是微不兼容的,因为Oracle没有像JDK 7那样将两个JDK项目整合在一起。现在它们几乎完全相同的代码库,但在7之前并非如此。

答案 3 :(得分:0)

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