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去管理,代碼開發難度大大減小;

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/190457.html
標籤:其他
