1. 程式人生 > >《深入Java虛擬機器》閱讀筆記(一)

《深入Java虛擬機器》閱讀筆記(一)

《深入Java虛擬機器》閱讀筆記(一)


1. Java虛擬機器主要的任務

Java虛擬機器主要的任務就是裝載class檔案並且執行其中的位元組碼。Java虛擬機器中包含一個類裝載器(class loader),它可以從程式或API中裝載class檔案,然後由執行引擎來執行位元組碼。

2. Java的方法有兩種

Java的方法有兩種,分別是Java方法和本地方法。其中Java方法由Java語言編寫並儲存在class檔案中,而本地方法一般由c/c++或組合語言編寫,儲存在動態連結庫中。因為Java語言的特性Java方法的呼叫是和平臺無關的。但是本地方法不同,執行中的Java程式呼叫本地方法時,虛擬機器裝載包含這個方法的本地方法動態庫,並呼叫這個方法。通過本地方法,Java程式可以訪問底層作業系統的資源。

3. Java class檔案在平臺無關性和網路移動性方面使Java更適應於網路。
3.1 它在平臺無關性方面的主要任務是:

為Java程式提供獨立於底層主機平臺的二進位制形式服務。Java class檔案是可以執行在任何支援Java虛擬機器的硬體平臺和作業系統上的二進位制檔案,而c/c++編寫的程式必須先編譯,然後連線成單獨的,專門支援特定的硬體平臺和作業系統的二進位制檔案。一般只能在指定的一個平臺上執行。

3.2 網路移動性方面主要體現在:

Java class檔案的緊湊性的優點。可以讓Java檔案快速的在網路上傳輸,大大減少了使用者的等待時間。

4. Java虛擬機器的生命週期

當一個Java程式啟動,那麼一個Java虛擬機器例項就產生了。當這個程式關閉退出,那麼這個Java虛擬機器例項也就結束了。在一個計算機上同時啟動多個Java程式,那麼也會產生同樣數量的Java虛擬機器例項。每一個Java程式都執行在他自己的虛擬機器例項中。

5. Java虛擬機器的執行緒

Java虛擬機器的執行緒分分為兩類:守護執行緒和非守護執行緒;守護執行緒通常由虛擬機器自己使用,比如執行垃圾收集的任務的執行緒,但是Java虛擬機器也可以把它建立的任何執行緒標記為守護執行緒。非守護執行緒包括常規的使用者執行緒或諸如用於處理GUI事件的事件排程執行緒,Java的初試執行緒就是非守護執行緒。當Java程式中所有非守護執行緒終止時,Java虛擬機器會自動退出,假如安全管理器允許,也可以通過System.exit();方法來退出虛擬機器。

6. Java虛擬機器的體系結構

每一個Java虛擬機器都有一個類載入器子系統,他根據給定的全限定名來裝載型別(類和介面)。同樣,每一個Java虛擬機器都有一個執行引擎,他負責執行那些被裝載類的方法中的指令。
當Java虛擬機器執行一個Java程式時,它需要記憶體來儲存一些資料,比如:位元組碼、從已裝載的類中解析的其他資訊、程式建立的物件、傳遞給方法的引數、返回值、區域性變數以及運算的中間結果。Java虛擬機器會將這些資訊組織到幾個執行時資料區中,以便於管理。

Java虛擬機器體系結構圖

6.1 方法區:

與堆一樣方法區由Java虛擬機器的例項中的執行緒所共享,Java虛擬機器裝載class檔案時,會將從class檔案的二進位制資料中解析的型別資料存放到方法區中。

6.2 堆:

當Java程式執行時,Java虛擬機器會將程式執行過程中建立的物件都存放到Java堆中,與Java方法區一樣,Java堆也是由Java虛擬機器的例項中的執行緒共享。

6.3 Java棧:

當一個執行緒被建立時會獲得一個Java棧,用於儲存該執行緒中Java方法呼叫的狀態——包括他的區域性變數、方法傳遞的引數、返回值以及運算的中間結果等等。這個棧不能被別的執行緒訪問。
Java棧是由許許多多的棧幀(stack frame)或者說(frame)組成,每一個棧幀中包含一個Java方法的呼叫狀態,每當執行緒呼叫一個Java方法時,虛擬機器壓入一個新的棧幀到該執行緒的Java棧中,當方法執行完畢後這個棧幀將被從Java棧中彈出並拋棄。

6.4 PC暫存器:

當一個執行緒被建立時會獲得一個他自己的PC暫存器(程式計數器),這個PC暫存器不能被別的執行緒訪問。如果執行緒執行的是一個Java方法,那麼PC暫存器的值將總是指示下一條將被執行的指令。

6.5 本地方法棧:

本地方法棧主要用來存放本地方法的呼叫狀態。

執行緒專有的執行時資料區

PS:上圖表示的是執行緒專有的執行時資料區,其中有三個執行緒在執行,執行緒3在執行本地方法,上圖中的Java棧都是向下生長,圖的底部表示Java棧頂。

6.6 Java資料型別

Java虛擬機器是通過某些資料型別來執行計算的,而資料型別及其運算都是有Java虛擬機器嚴格規範定義的。在Java中資料型別分為基本型別引用型別
基本資料型別包括:數值型別boolean以及只有Java虛擬機器內部使用的returnAddress(用來實現Java中的finally子句),數值型別又分為整數型別(byte,short,int,long,char)和浮點數型別(float,double)。
引用型別包括:類型別、介面型別、陣列型別。
這三種引用型別的值都是對動態建立物件的引用。類型別的值是對類的例項的引用,介面型別的值是對實現了該介面的某個類例項的引用,陣列型別的值是對陣列物件的引用。在Java中null是一種特殊的引用值,它表示該引用變數沒有引用任何物件。
Java虛擬機器的資料型別