JVM的結構
如下部分來源自Oracle公司官網的技術文檔
連接地址
0.概述
JVM規範描述的是一種抽象的機器。它並無描述任何關於JVM的具體的實際的實現。
爲了正確的實現一個JVM,你須要可以讀取class文件,而且正確的執行class文件中指定的操做。咋JVM規範中沒有涉及具體的實現的部分,這樣的作法不會約束實現者的創造力。例如:運行時數據域的內存分佈,使用的GC算法,任何JVM指令集的優化等等都被留給JVM實現者去實現,這樣給實現者很大的靈活創造的餘地。
1.class文件格式
將要被JVM執行的編譯後代碼被表示成一種與硬件、操做系統無關的二進制文件格式,典型的(可是不必定)就是存儲在一個被稱爲class的文件中。這個class文件準確的描述了一個類或者接口的細節例如字節的順序以及其餘細節的表示。
2.數據類型
像Java編程語言,JVM操做兩種類型:原始類型(primitive types)、引用類型(reference types).固然,相應的能被存儲在變量中,能被做爲參數傳遞,能被方法返回,能被運算的也有對應的兩種值即:原始值(primitive values)、引用值(reference values)。
JVM但願幾乎全部的類型檢查的工做在運行以前被完成,一般來說是被一個編譯器完成,而不是JVM本身去完成這個類型檢查的工做。
原始類型的值(primitive values)不須要被標記或者在運行時被檢查或者和引用類型的值做區分。代替的是,JVM的指令集使用操做這些運算對象類型的指令來區別運算對象的類型。例如:iadd,ladd,fadd,和dadd是JVM中加和兩個數字類型的值(numeric values)產生數字結果(numeric results)的所有指令了,分別對應的預算對象的類型是int,long,float,double.
JVM包含了對對象概念的顯著性的支持。一個對象要麼是一個動態分配的類的實例要麼是一個數組。一個對對象的引用被認爲擁有JVM類型引用。類型引用的值能夠被認爲是一個指向對象的指針。多個引用指向一個對象的狀況是存在的。對象始終是經過類型引用的值被操做,傳遞,檢測。html
3.原始類型和值
被JVM支持的原始數據類型是數字類型(numeric types)、boolean類型、返回地址類型(returnAddress type)
數字類型包含整形類型(integral types)、浮點型類型(floating-point types)
.integral types包含以下類型:
byte 8bit(有符號signed)
short 16bit(有符號signed)
int 32bit(有符號signed)
long 64bit(有符號signed)
char 16bit(無符號unsigned)(0-65535)
.floating-point types包含以下類型
float 32bit(有符號signed)
double 64bit(有符號)
.boolean類型
值爲true 或者 false 默認值爲false
儘管JVM定義了boolean類型,可是它僅僅提供了有限的支持。沒有J單獨的JVM指令集去單獨表示在boolean類型的值上的操做。代替的是,關於boolean類型的值的表達式被編譯時使用int數據類型的值。
.returnAddress類型
returnAddress類型的值是指向JVM指令集的操做碼的指針。在原始數據類型中,只有returnAddress類型不是直接和Java編程語言直接聯繫的類型,在Java語言中沒有對應的類型而且在運行時不可以被修改。
JVM確實直接提供對boolean數組的支持。它的newarray指令可以適用於創造boolean數組。boolean類型的數組被訪問和修改經過使用byte數組的指令baload 和 bastore
JVM是這麼編碼boolean數組的,使用1表明true,0表明false.在Java編程語言中使用JVMint類型的值來映射boolean類型的值的地方,編譯器也必須使用相同的方式進行編碼。
4.引用類型和值
有三種引用類型,類,數組,接口,他們的值是對動態創造的類實例,數組,或者實現接口的類實例或者數組的引用。
一個引用的值也許是特殊的null引用,一個對空對象的引用,這種狀況基於被表示爲null。null引用初始化的時候沒有運行時類型,可是可以被轉化成任何類型。引用類型的默認值就是 null。
5.運行時數據域(Run-Time Data Areas) 關於運行時數據類型的內容下篇博文繼續更新。。。