本文檔指定了一個抽象機器,它沒有描述Java虛擬機的任何特定實現。算法
要正確實現Java虛擬機,你只須要可以讀取類文件格式並正確執行其中指定的操做,不屬於Java虛擬機規範的實現細節會沒必要要地限制實現者的創造力。例如,運行時數據區的內存佈局、使用的垃圾收集算法、Java虛擬機指令的任何內部優化(例如,將它們轉換爲機器代碼)由實現者自行決定。編程
本規範中對Unicode的全部引用都是針對Unicode標準版本11.0.0給出的,可從http://www.unicode.org/獲取。數組
由Java虛擬機執行的編譯代碼使用獨立於硬件和操做系統的二進制格式表示,一般(但不必定)存儲在文件中,稱爲class文件格式,類文件格式精確地定義了類或接口的表示,包括可能在特定於平臺的目標文件格式中被認爲是理所固然的字節排序等細節。編程語言
第4章「class文件格式」詳細介紹了class文件格式。佈局
與Java編程語言同樣,Java虛擬機也可使用兩種類型:原始類型和引用類型。相應地,有兩種值能夠存儲在變量中、做爲參數傳遞、由方法返回,並對其進行操做:原始值和引用值。測試
Java虛擬機指望幾乎全部類型檢查都在運行時以前完成,一般由編譯器完成,而沒必要由Java虛擬機自己完成,原始類型的值不須要被標記或以其餘方式檢查以在運行時肯定它們的類型,或者與引用類型的值區分開來。相反,Java虛擬機的指令集使用對特定類型的值進行操做的指令來區分其操做數類型,例如,iadd
、ladd
、fadd
和dadd
都是Java虛擬機指令,它們添加兩個數值併產生數值結果,但每一個指令都專門分別用於其操做數類型:int
、long
、float
和double
。優化
Java虛擬機包含對對象的顯式支持,對象是動態分配的類實例或數組,對對象的引用被視爲具備Java虛擬機類型引用,類型引用的值能夠被認爲是指向對象的指針,一個對象可能存在多個引用,對象老是經過類型引用的值操做、傳遞和測試。編碼
Java虛擬機支持的原始數據類型是數字類型、布爾類型和returnAddress類型。操作系統
數字類型由整數類型和浮點類型組成。指針
整數類型是:
byte
,其值爲8位有符號二進制補碼整數,其默認值爲零。short
,其值爲16位有符號二進制補碼整數,其默認值爲零。int
,其值爲32位帶符號的二進制補碼整數,其默認值爲零。long
,其值爲64位帶符號的二進制補碼整數,其默認值爲零。char
,其值爲16位無符號整數,表示基本多語言平面中的Unicode代碼點,使用UTF-16編碼,其默認值爲空代碼點('\u0000'
)。浮點類型是:
float
,其值是浮點值集的元素,或者,若是支持,則爲浮點擴展指數值集,其默認值爲正零。double
,其值是雙精度值集的元素,或者,若是支持,則爲雙精度擴展指數值集,其默認值爲正零。布爾類型的值對真值true
和false
進行編碼,默認值爲false
。
Java®虛擬機規範的初版沒有將布爾值視爲Java虛擬機類型,可是,布爾值在Java虛擬機中的支持有限,Java®虛擬機規範的第二版經過將布爾值視爲一種類型來澄清該問題。
returnAddress類型的值是指向Java虛擬機指令操做碼的指針,在原始類型中,只有returnAddress類型與Java編程語言類型沒有直接關聯。
Java虛擬機的整數類型的值是:
byte
,從-128到127(-27到27 - 1),包括端值。short
,從-32768到32767(-215到215 - 1),包括端值。int
,從-2147483648到2147483647(-231到231 - 1),包括端值。long
,從-9223372036854775808到9223372036854775807(-263到263 - 1),包括端值。char
,從0到65535,包括端值。浮點類型是float
和double
,概念上與IEEE二進制浮點算術標準中規定的32位單精度和64位雙精度格式IEEE 754值和運算相關聯。
IEEE 754標準不只包括正負號數,還包括正負零,正負無窮大,以及特殊的非數字值(如下簡稱爲「NaN」),NaN值用於表示某些無效操做的結果,例如將零除以零。
Java虛擬機的每一個實現都須要支持兩個浮點值的標準集,稱爲浮點值集和雙精度值集,此外,Java虛擬機的實現能夠選擇支持兩個擴展指數浮點值集中的一個或兩個,稱爲浮點擴展指數值集和雙精度擴展指數值集,在某些狀況下,可使用這些擴展指數值集代替標準值集來表示float
或double
類型的值。
任何浮點值集的有限非零值均可以表示爲s · m · 2(e - N + 1),其中s爲+1或-1,m是小於2N的正整數,e是Emin = -(2K-1-2)和Emax = 2K-1-1之間的整數,包括端值,其中N和K是依賴於值集的參數。有些值能夠用多種方式以這種形式表示,例如,假設值集中的值v可能使用s、m和e的某些值表示爲此形式,那麼若是m是偶數且e小於2K-1,則能夠將m減半,將e增長1,以產生相同值v的第二個表示。若是m ≥ 2N-1,這種形式的表示稱爲標準化,不然該表示被稱爲非標準化,若是值集中的值不能以m ≥ 2N-1的方式表示,則該值稱爲非標準化值,由於它沒有標準化表示。
下表中總結了對兩個必需和兩個可選浮點值集的參數N和K(以及派生參數Emin和Emax)的約束。
參數 | 浮點 | 浮點擴展指數 | 雙精度 | 雙精度擴展指數 |
---|---|---|---|---|
N | 24 | 24 | 53 | 53 |
K | 8 | ≥ 11 | 11 | ≥ 15 |
Emax | +127 | ≥ +1023 | +1023 | ≥ +16383 |
Emin | -126 | ≤ -1022 | -1022 | ≤ -16382 |