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壓力,大物件或者逃逸物件無法在棧上分配。
堆疊方法區互動