2013-05-08 46 views
24

我真的在努力瞭解以下的事情什麼用JVM的,如果JIT正在執行的字節碼轉換爲機器指令

以前我知道:

當一個Java程序被編譯,將產生.class文件。在那個代碼中是以字節的形式。然後JVM將把該字節代碼翻譯成機器可理解的格式。

現在我看到在one of the questions in SO

一個剛剛在實時(JIT)編譯器是運行時 解釋的特點,即不是每一種方法 被調用時解釋字節碼,將將字節碼編譯成機器碼 跑步機器的指令

所以這裏JIT將字節碼轉換爲機器指令。那麼什麼是JVM的用法。我們可以用JIT來做到這一點。據我所知,JIT只是爲了提高JVM的性能。

在此先感謝..

回答

2

要明確:

JVM執行一切都像:

它停留在操作系統的頂部和編譯java程序之間提供一個抽象 和操作系統。這樣,java 編譯好的程序就不用擔心它要運行哪個平臺了,需要 工作。 Java程序將代碼編譯爲JVM可以理解並執行的字節碼。

JIT

當JVM編譯的類文件,它沒有完成滿級 文件;它僅在需要的基礎上編譯它的一部分。這樣可以避免重複分析完整的源代碼。這種類型的編譯被稱爲 JIT或即時編譯。 JVM是平臺(OS)相關的代碼生成 JIT被平臺面向,產生本機字節代碼,所以它比較快一個比JVM :)

+0

但我看到聲明JIT編譯整個類文件once.But在您的聲明jvm正在編譯。請解釋 – Anusha 2013-05-08 11:44:07

+0

@Anusha yah ... JVM執行編譯部分[逐行]本地解釋器java..but JIT是可選的,它也可以編譯,而不是所有的只是必要的方法/功能。 對於一個案例,請考慮: JIT編譯器不檢查Java邊界條件,例如空指針或數組越界異常。 JIT編譯器知道它有一個空指針異常的唯一方法是由操作系統引發的一個信號。 – 2013-05-08 12:05:52

+0

這只是錯誤的。 javac Java編譯器解析Java源代碼並將其編譯爲Java字節碼(與機器無關),即.class文件。 JIT編譯器將該字節碼編譯爲本地機器代碼(CPU專用)。 JIT輸出機器代碼仍然執行邊界檢查和Java異常處理。 – arjunyg 2017-08-30 19:04:41

1

它編譯它只是在時間與優化的JVM。

21

JIT只是部分的JVM。其他部分包括字節碼解釋器,類加載驗證和鏈接機制,以及反射,I/O等東西的本機代碼支持。

從這個意義上說,JIT不會讓JVM運行得更快。相反,它會使Java代碼運行得更快......如果JVM剛剛解釋它,它將會運行得更快。

實際上,JVM 確實從開始解釋字節碼。經過一段時間後,JVM使用其JIT編譯器將大量使用的方法編譯爲本地代碼,使用解釋時收集的統計信息調整手頭問題的代碼。

順便說一句,文字的這部分,你報的笨拙和技術上不準確的:

一個剛剛在實時(JIT)編譯器是運行時解釋的功能... (context)

實際上,JIT不是解釋器的一個特性。相反,JIT是JVM的功能,協同工作。

0

Java虛擬機(JVM)爲運行Java程序提供了整個環境。它與操作系統集成,加載類並運行程序。即時編譯器(JIT)只是一小部分可以被禁用(-XINT),但啓用後,可提供有用的性能改進。已經有JVM的實現不包含JIT,以及通過將Java編譯爲與傳統語言(如C或C++)相同的機器代碼工作的實現。

相關問題