JVM(Java Virtual Machine)常被稱為java虛擬機器器,用來將java中的.class檔案進行執行,不同作業系統版本的JDK對應不同的JVM,宏觀上來說,就是從軟體層面遮蔽不同作業系統在底層硬體與指令上的區別.
將.class檔案在終端視窗利用命令javap -c對程式碼進行反組合
會得到對應的JVM指令形式的程式 如下
如上表所示,我們會看到程式計數器對每一步都有計數,例如computer()方法中的0~12步;
這裡我們說一下,為什麼JVM中會有程式計數器的存在,假設有多個執行緒在執行,其中一個執行緒A執行到4時,突然有另外一個優先順序更高的執行緒B來執行,當這B執行完後,A因為程式計數器的存在,可以繼續從4開始執行.
上表每一步的JVM指令又分別代表什麼含義呢?
舉個例子(這裡有具體JVM指令手冊,但是我不會上傳!!!):
接下來我們來深入瞭解一下JVM中具體有什麼,他們之間有什麼樣的關聯?
(1)JVM虛擬機器器由三部分組成,分別是:類裝載子系統,執行時資料區(記憶體模型)—>最重要的一部分,位元組碼執行引擎;
(2)類裝載子系統用來載入.class;位元組碼執行引擎負責對程式計數器的修改以及.class的執行;
(3)執行時資料區中包括:棧,堆,方法區(元空間),程式計數器,本地方法棧;其中棧,本地方法棧和程式計數器每個執行緒都獨有一份,而堆和元空間是所有執行緒公共的;
(4)棧:想要了解棧,就要對棧幀有所瞭解,棧記憶體中有很多棧幀,一個方法對應一塊棧幀記憶體區域;棧幀中包含四部分:區域性變數表(儲存區域性變數),運算元棧(運算元執行操作過程中臨時存放的空間,類似資料結構中的棧FIFO),動態連結,方法出口(記錄方法執行完,下一步要執行的位置);
(5)方法區(元空間):分為常數區,靜態變數區和類資訊區;
(6)堆:用來儲存物件,棧中的對應區域性變數儲存物件對的地址參照;
如果該物件是通過靜態屬性建立的,那麼對應的方法區中的靜態變數來儲存該物件的地址參照;
(7)本地方法棧:java底層用關鍵字native修飾的方法(這種方法沒有方法體,底層利用c.c++進行修飾);這裡說一下很重要的c和java的區別:C語言記憶體管理需要自己分配和釋放,Java語言由JVM去管理,程式碼開發難度大大減小;