1. 程式人生 > >jvm入門(1)

jvm入門(1)

1.java虛擬機器原理:
所謂虛擬機器,就是一臺虛擬的機器。它是一款軟體,用來執行一系列虛擬計算機指令,大體上虛擬機器可以分為系統虛擬機器和程式虛擬機器,大名鼎鼎的Visual Box、VMare就屬於系統虛擬機器,他們完全是對物理計算機的模擬,提供了一個可執行完整作業系統的軟體平臺。程式虛擬機器典型代表就是Java虛擬機器,它專門為執行單個計算機程式而設計,在java虛擬機器中執行的指令會成為java位元組碼指令。無論是系統虛擬機器還是程式虛擬機器,在上面執行的軟體都被限制於虛擬機器提供的資源中。Java發展至今,出現過很多虛擬機器,最初Sun使用的一款叫Classic的Java虛擬機器,到現在引用最廣泛的是HotSpot虛擬機器,除了Sun意外,還有BEA的JRockit,目前JRockit和HotSpot都被Oracle收入旗下,大有整合的趨勢。

2.java虛擬機器基本結構:
這裡寫圖片描述

3.各個部分的說明:
1 類載入子系統:負責從檔案系統或者網路中載入Class資訊,載入的資訊 存放在一塊稱之為方法區的記憶體空間。

2 方法區:就是存放類資訊、常量資訊、常量池資訊、包括字串字面量和數字常量等。

3 java堆:在java虛擬機器啟動的時候建立java堆,它是java程式最主要的記憶體工作區域,幾乎所有的物件例項都存放到java堆中,堆空間是所有執行緒共享的。

4 直接記憶體:Java的NIO庫允許java程式使用直接記憶體,從而提高效能,通常直接記憶體速度會優於java堆。讀寫頻繁的場合可能會考慮使用。

5 每個虛擬機器執行緒都有一個私有的棧,一個執行緒的java棧線上程建立的時候被建立,java棧中儲存著區域性變數、方法引數、同時java的方法呼叫、返回值等。

6 本地方法棧和java棧非常類似,最大不同為本地方法棧用於本地方法呼叫。java虛擬機器允許java直接呼叫本地方法(通常使用C編寫)。

7 垃圾收集系統是java的核心,也是必不可少的,java有一套自己進行垃圾清理的機制,開發人員無需手工清理,我們稍後詳細說明。

8 PC(Program Counter)暫存器也是每個執行緒私有的空間,java虛擬機器會為每個執行緒建立PC暫存器,在任意時刻,一個java執行緒總是在執行一個方法,這個方法被稱為當前方法,如果當前方法不是本地方法,PC暫存器就會執行當前正在被執行的指令,如果是本地方法,則PC暫存器值為undefined,暫存器存放如當前執行環境指標、程式計數器、操作棧指標、計算的變數指標等資訊。

9 虛擬機器最核心的元件就是執行引擎了,它負責執行虛擬機器的位元組碼。一般會先進行編譯成機器碼後執行。

4.堆、棧、方法區概念和聯絡
堆解決的是資料儲存的問題,即資料怎麼放、放在哪兒。棧解決程式的執行問題,即程式如何執行,或者說如何處理資料。方法區則是輔助堆疊的塊永久區(Perm),解決堆疊資訊的產生,是先決條件。
我們建立一個新的物件,User:那麼User類的一些資訊(類資訊、靜態資訊都存在於方法區中)而User類被例項化出來之後,被儲存到java堆中的一塊記憶體空間;當我們去使用的時候,都是使用User物件的引用,形如User user = new User();這裡的user就是存放在java棧中的,即User真實物件的一個引用。

5.java堆的結構
java堆是和java應用程式關係最密切的記憶體空間,幾乎所有的物件都存放在其中,並且java堆完全是自動化管理的,通過垃圾回收機制,垃圾物件會自動清理,不需要顯示地釋放。
根據垃圾回收機制不同,Java堆有可能擁有不同的結構。最為常見的就是將整個java堆分為新生代和老年代。其中新生代存放新生的物件或者年齡不大的物件,老年代則存放老年物件。
新生代分為eden區、s0區、s1區,s0和s1也被稱為from和to區域,他們是兩塊大小相等並且可以互換角色的空間。
絕大多數情況下,物件首先分配在eden區,在一次新生代回收後,如果物件還存活,則會進入s0或者s1區,之後每經過一次新生代回收,如果物件存活則它的年齡就加1,當物件達到一定的年齡後,則進入老年代。
這裡寫圖片描述

6.java棧的結構:
java棧是一塊執行緒私有的記憶體空間,一個棧,一般由三部分組成:區域性變量表、運算元棧和幀資料區。
區域性變量表:用於報錯函式的引數及區域性變數。
運算元棧:主要儲存計算過程的中間結果,同時作為計算過程中變數臨時的儲存空間。
幀資料區:除了區域性變量表和運算元棧以外,棧還需要一些資料來支援常量池的解析,這裡幀資料區儲存著訪問常量池的指標,方便程式訪問常量池,另外,當函式返回或者出現異常時,虛擬機器必須有一個異常處理表,方便傳送異常的時候找到異常的程式碼,因此異常處理表也是幀資料區的一部分。

7.方法區:
java方法區和堆一樣,方法區是一塊所有執行緒共享的記憶體區域,它儲存系統的類資訊,比如類的欄位、方法、常量池等。方法區的大小決定了系統可以儲存多少個類,如果系統定義太多的類,導致方法區溢位。虛擬機器同樣會丟擲記憶體溢位錯誤。方法區可以理解為永久區(Perm)。