2014-02-20 220 views
0

Java字節碼是Java源代碼編譯的語言,而Java虛擬機可以識別的語言是 。與編譯語言 必須針對每種不同類型的計算機專門編譯不同, 只需要將Java程序轉換爲 之後的一個Java程序,它可以在Java虛擬機 所在的任何平臺上運行。Java 32位和64位

我可以理解,一旦java被編譯,類可以從任何機器運行,因爲編譯的類可以被任何機器理解。

我的問題是:爲什麼有兩種類型的jdk呢? (x86,x64)

+0

由於底層架構不同:endianness,vendor等x86具有32位和64位版本,ARM也是如此,然後是SPARC,MiPS等等......不僅32bit vs 64bit – fge

+0

您的應用程序代碼是可移植的,JVM不是。您需要針對您打算使用的每個硬件架構和操作系統進行實施。 –

+1

@assylias不完全相同的問題。 –

回答

2

Java虛擬機本身就是需要在硬件架構和操作系統之上運行的應用程序,並且很可能它們不是用Java自己實現的。

這就是流行的Java HotSpot Virtual Machine(Oracle的默認實現)的情況,它主要在C/C++中實現。

這意味着您需要爲其打算使用它的每個硬件體系結構和操作系統編譯版本,因此這解釋了32位和64位硬件體系結構的版本。

這也是其他JVM實現的情況,如JRockit,IBM J9,Azul Systems Zulu和可能的many others

Other helper programs不考慮Java虛擬機,通常包括程序員開發應用程序作爲JDK(Java開發工具包)的一部分,也可以通過這種方式開發。這就是編譯器(javac),文檔生成器(javadoc),RMI編譯器(rmic),Java反彙編器,(javap)等工具的情況。

因此,那些JDK工具還需要硬件依賴的實現。這就是爲什麼在下載JDK時爲您提供選擇的原因。

- 編輯 -

尋址的「便攜性」主題

這取決於你的意思是「便攜性」是什麼的問題。如果您的意思是Java的WORA(只寫一次,隨處運行),那麼它必須通過Java,Python或Ruby等虛擬機。但是像C/C++這樣的語言編譯爲機器代碼,因此它們不是通過虛擬機運行,而是通過硬件本身運行。這並不意味着它們不可移植,您可以按照可以在多種體系結構中運行的方式編寫代碼,只是您不能使用相同的二進制文件。您必須重新編譯每個案例,因爲程序必須以特定硬件/操作系統理解的方式編寫/編譯。

這個差距是虛擬機打算關閉的。

現在,可移植性可能意味着不僅僅是使用相同的二進制文件。即使Java中,你可以編寫代碼是不可移植的,也許是因爲你是因爲使用了文本,則誤編程的路徑(即Linux的/ VS的Windows \)使用依賴於操作系統的特性或等

+1

我愛列表;特別是帶鏈接的列表。 +1 – NobleUplift

+0

爲什麼不認爲ruby和python具有與java相同的屬性?如果解釋相同的代碼將在所有平臺上運行 – Bula

+1

@Bula是的,他們是。在Ruby的情況下,通常你會自己爲自己的架構或[從其他地方獲取二進制文件]構建它(http://rubyinstaller.org/)。並且[Python下載頁面](http://www.python.org/downloads/)明確提供了替代方法來下載不同硬件體系結構的語言。 –

2

有兩種以上的JDK。每種類型的JDK都是針對特定平臺,Intel x86,x64,ARM等進行編譯的。儘管它們是針對不同平臺編寫的,但它們的功能相同。所以需要很多類型,因爲通常您不能在另一個平臺上運行JDK(例如,您不能在x86上運行JDK for ARM)。

0

Java語言是可移植的,二進制需要讓他們移動不是。例如,jvm和javac都是不可移植的。

如果使用java編寫javac,它會太慢,並且如果在沒有javac的情況下編寫javac就會陷入雞蛋和雞蛋的情況 - 所以它通常是用c或C++編寫的,因此它不是便攜。

此外,jvm正在完成便攜式字節碼的翻譯工作,並將其轉換爲您正在運行的特定機器的特定非可移植代碼,因此它不能移植。

+0

實際上,'javac' **是用Java編寫的; 'javac.exe'只是一個很小的包裝器,它啓動JVM並控制javac類的'main'方法。順便說一下,大多數'C'編譯器都是用'C'編寫的,所以你應該看到,「雞肉和雞蛋的情況」是可以解決的。 – Holger

0
  1. 64位jdk的性能優於32位jdk,但它需要更多的內存。
  2. 32位應用程序只能在Windows上訪問2GiB的內存。