1. 程式人生 > >JVM 理解(一)

JVM 理解(一)

JVM歷史瞭解

1996年 Classic  VM釋出,到2002年jdk1.4 Classic VM退出歷史舞臺 NIO問世。

2004年jdk1.5釋出產生重要改變,增加 範型、註解、裝箱、列舉、可變長引數,都是我們現在常用到的。

2011年jdk1.7釋出NIO2即現在的AIO等

2014年jdk1.8  Lambda表示式問世。CurrentHashMap升級  、對IO做了升級等。

JVM執行流程

      java程式經過一次編譯之後,將java程式碼編譯為位元組碼也就是class檔案,然後在不同的作業系統上依靠不同的java虛擬機器進行解釋,最後再轉換為不同平臺的機器碼,最終得到執行。

載入

JVM基本結構

如下圖

Java虛擬機器只與“Class檔案”關聯,與語言和檔案的來源無關,如:可以通過Java、Ruby生成一個class檔案,甚至可以按照“Class檔案”的檔案格式自己手動編寫一個class檔案,但是這個檔案有特定的結構。

       從這個結構不難看出,class檔案被jvm裝載以後,經過jvm的記憶體空間調配,最終是由執行引擎完成class檔案的執行。當然這個過程還有其他角色模組的協助,這些模組協同配合才能讓一個java程式成功的執行,下面就詳細介紹這些模板,它們也是後面學習jvm最重要的部分。

暫存器:每個執行緒都又一個暫存器,指向下一個指令地址。

方法區:類載入時,儲存類的資訊(型別的常量池、欄位、方法資訊、方法位元組碼資訊)

JAVA堆:應用系統物件都儲存在堆中,所有執行緒共享java堆資訊,對分代GC而已堆是分代的如下

JAVA棧:屬執行緒私有,棧由一系列幀構成,幀儲存一個方法的區域性變數資訊、運算元棧、常量池指標,每一次方法呼叫建立一個幀並壓棧

小物件在沒有逃逸情況下一般可以直接在棧上分配,可自動回收,減輕GC壓力,大物件或者逃逸物件無法在棧上分配。

堆疊方法區互動