簡體   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