2017-08-10 22 views
-5

這個問題總是存在於我的。這些.class文件的權力是無處不在的。我在技術上知道它是可移植的。但是會喜歡以外行人的名義和有趣的例子聽到java中的.class文件如何在幾乎所有的環境中運行

在此先感謝。

+6

三個字母的答案:** JVM ** –

+1

請參閱維基百科:https://en.wikipedia.org/wiki/Java_bytecode – howlger

+0

請參閱[關於Java技術](https://docs.oracle.com/javase) /tutorial/getStarted/intro/definition.html)。 – Jesper

回答

0

我會盡量以儘可能簡單的術語來解釋這一點。

您編寫Java代碼並將其保存在.java文件中。然後.java文件被Java編譯器轉換爲.class文件。

現在這個.class文件包含什麼?它是否包含處理器可以直接運行的機器代碼?不,如果它確實是Java的話,那就不會是跨平臺的。 .class文件包含Java 字節碼

沒有處理器可以直接運行Java字節碼。人們必須安裝稱爲「Java運行時環境」(JRE)的東西。 JRE可以讀取字節碼! JRE解釋.class文件中的字節碼並將它們轉換爲處理器指令。

由於存在不同的處理器體系結構(不同種類的處理器)和不同的操作系統,因此需要不同的JRE。有一個用於Windows 32位的JRE,一個用於Windows 64位,一個用於Mac等。

這裏有一個比喻:

你用英語寫的東西,你想日語的人,一箇中國的揚聲器和揚聲器朝鮮明白你寫什麼。你怎麼做到這一點。您分別聘請了日文,中文和韓文的翻譯員!這樣所有3個人都能理解同一個英文文本!

0

Java源代碼被編譯爲字節碼,這是存儲在由編譯器生成的.class文件中的內容。這些字節碼由Java虛擬機(JVM)執行。這裏的線索是名爲'虛擬'的。 JVM獲取每個字節碼並解釋它,這意味着它將其從虛擬機表示轉換爲運行JVM的物理機器的表示。這樣,一旦JVM移植到新的硬件/操作系統組合,所有的Java代碼都可以在該平臺上工作,保持不變。

通常這是一對一映射(對於像邏輯二進制操作這樣的事情)。但是,這可能要複雜得多,爲了獲得良好的性能,需要分析可能長序列的字節碼。這就是自適應編譯進來的地方。它使用Just-In-Time(JIT)編譯來在應用程序運行時編譯代碼的HotSpots。當你開始執行一個循環時,JVM會注意到對同一個方法的重複調用並編譯和緩存該方法,所以不需要每次都解釋它。

JIT編譯通常可以提供比更傳統的AOT編譯更好的性能,尤其是像Java這樣的語言,其中類可以在運行時動態加載。推測性優化和更積極的方法內聯都可以使用JIT而不是AOT。

OpenJDK提供了兩個JIT編譯器:C1和C2(有時也稱爲客戶端和服務器)。這些提供了不同的配置文件。 C1加熱速度更快,但提供較低的最佳性能水平。 C1升溫更慢,但優化效果更好。最近使用了分層編譯,它從C1開始,然後切換到C2。

Azul(我工作的人)剛剛推出了替代C2 JIT的替代產品,叫做Falcon。這基於LLVM開源項目,旨在爲現代硬件更好地進行優化。

相關問題