1.1 JVM系統架構圖
JVM是什麼?
JVM是Java Virtual Machine(Java虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。
引入Java語言虛擬機器後,Java語言在不同平臺上執行時不需要重新編譯。Java語言使用Java虛擬機器遮蔽了與具體平臺相關的資訊,使得Java語言編譯程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。
2.1 類載入器
類裝載器(ClassLoader)主要負責載入class檔案,是否能執行主要取決於execution engine它是負責執行被載入類中包含的指令。有兩種類載入器分別為啟動類載入器和使用者自定義類載入器,然而啟動類載入器是JVM實現的一部分,使用者自定義類載入器是Java程式一部分。
主要有四個:
- Bootstrap根載入器
- extern類擴充套件載入器
- App系統類載入器
- 使用者自定義載入器
2.1.1 雙親委派機制
雙親委派機制的作用
1、防止重複載入同一個.class。通過委託去向上面問一問,載入過了,就不用再載入一遍。保證資料安全。
2、保證核心.class不能被篡改。通過委託方式,不會去篡改核心.clas,即使篡改也不會去載入,即使載入也不會是同一個.class物件了。不同的載入器載入同一個.class也不是同一個Class物件。這樣保證了Class執行安全。
通俗來說就是如果你自己寫了一個String類,通過雙親委派機制,該類會由最頂上的根載入器進行載入,而不會被系統類載入器載入。以此來保證java自帶類安全
2.1.2 沙箱安全機制
雙親委派機制保證了沙箱安全機制,使得java自帶的一些核心類不被使用者所任意修改。
3.1 Native
被Native修飾的方法為本地方法,jvm識別到該方法為本地方法後,將載入本地方法棧區,最後由本地方法棧與本地方法介面進行一個互動,本地方法介面會去連結相關的本地方法庫。
這一流程做完之後,再交給方法執行引擎執行。
4.1 PC暫存器
PC暫存器就像一個指標指向暫存器裡下一個將要執行的程式的引數入口地址。
JVM中的程式計數器(Program Counter Register)中,Register的命名源於CPU的暫存器,暫存器儲存指令相關的現場資訊。CPU只有把資料裝載到暫存器才能執行。
這裡,並非廣義上所指的物理暫存器,獲取將其翻譯為PC暫存器(或指令計數器)會更加貼切(也稱為程式鉤子),並且也不容器引起一些不必要的誤會。JVM中的PC暫存器是對物理PC暫存器的一種抽象模擬。
作用:
PC暫存器用來儲存指向下一條指令的地址,也即將要執行的指令程式碼。由執行引擎讀取下一條指令。
它是一塊很小的記憶體空間,幾乎可以忽略不記。也是執行速度最快的儲存區域。
在JVM規範中,每個執行緒都有它自己的程式計數器,是執行緒私有的,生命週期與執行緒的生命週期保持一致。
任何時間一個執行緒都只有一個方法在執行,也就是所謂的當前方法。程式計數器會儲存當前執行緒正在執行的java方法的JVM指令地址:或者,如果是在執行native方法,則是未指定值(undefined)
它是程式控制流的指示器,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。
位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一個條需要執行的位元組碼指令。
它是唯一一個在Java虛擬機器規範中沒有規定任何OOM情況的區域。