2010-08-01 197 views
3

Java代碼被編譯爲可跨多個平臺移植的字節碼。 但Java也是JIT編譯的,它在飛行中發生。Java代碼和JIT編譯

這是否意味着Java是編譯兩次?首先由我們生成字節碼,然後由JVM生成第二個字節碼? 謝謝。

回答

7

你的代碼可能通過字節碼,如果它的「辣」的JVM被編譯爲本地代碼;並且可能會多次編譯,舊版本將被丟棄,具體取決於程序的運行時特性。

的JIT是一個複雜的野獸;實際上,Sun JVM有兩個JIT(-client和-server),它們的行爲彼此不同,有些實現甚至支持兩個JIT一起運行(因此,您可能已將字節碼解釋爲與由應用程序中的兩個不同JIT編譯的代碼一起運行) 。

我建議你閱讀更多關於熱點(最常見的JIT,因爲它是太陽的),如果你對這個問題很感興趣。您可以從Sun's page開始。

+0

爲什麼可以編譯多次?爲什麼第一次編譯的字節碼不夠用? – Chiron 2010-08-01 20:20:49

+2

很多事情可能會導致JIT丟棄舊的編譯;事情就像從未採用過的其他分支那樣簡單,可能會導致JIT發出「錯誤」並丟棄舊代碼(每次都基於同一分支)。 – vanza 2010-08-02 03:00:58

+0

有時它也會編譯代碼以防萬一,即使這個方法沒有被執行過。然後,在調用該方法時,它會將其重新編譯爲更優化的版本。 – 2010-08-02 05:18:19

7

TMK,當您編譯您正在編譯爲JVM平臺。然後,當您在任何機器上的JVM上運行應用程序時,經常使用的代碼的某些部分會被編譯爲原始代碼爲的代碼以進行優化。

因此,在短期:是的,但對於一個很好的理由

+0

這是正確的; JVM將進一步將部分代碼編譯爲本地機器代碼,以便運行得更快(因爲本機機器代碼和Java字節代碼之間沒有更多的抽象)。此運行時編譯的行爲稱爲JustInTime(JIT)編譯。 – 2010-08-01 19:51:52

+0

所以只有經常使用的代碼是JIT編譯的? 這是一個新的信息給我,謝謝。 – Chiron 2010-08-01 20:18:03

+1

這可能是更正確的說,字節碼*替換*等價的本地代碼,而不是*重新編譯*。編譯通常是比代碼替換/優化更復雜的過程。 – 2010-08-01 20:28:21

2

這是否意味着Java是編譯兩次?我們首先由 生成字節碼 ,第二個由JVM生成?謝謝。

可以說,一旦在運行時使用的源代碼(編譯器)提供的信息,那麼其他(JVM/JIT)時有關特定硬件信息可用,一些沿分析來決定什麼是JIT編譯或不。

1

機制是

爪哇 - >字節碼(編譯通過Java編譯器)

字節代碼 - >本地代碼(由JVM解釋)

0

簡短的回答:是的那種。

最長的一個:這是兩種不同的東西。 第一次編譯是從源代碼到字節碼,通常在編譯字段中調用中間表示(IR)。

然後虛擬機將字節碼轉換回安裝它的平臺上的本機代碼。

這是2種完全不同的彙編。第二個甚至不是一個彙編,因爲沒有語法檢查器範圍分析器......那麼有一些檢查,但不是在編譯器中有同樣的檢查。