JVM--心得概念,jvm--心得
最近抽空重新溫習一下JVM的概念,現在把心得記錄一下。
第一部分:根據學習抽象出一個JVM的概念圖,描述各個主要組件的構成和基本作用。
第二部分:根據結構圖,對內容進行說明。
1)--JVM的概念
JVM是JAVA VIRTUAL MACHINE的縮寫,它是一個虛擬電腦裝置。
一般的進階語言要想在不同的平台上運行,那麼首先要編譯成平台識別的編譯語言。
java具有跨平台性,其中的核心特點就是使用了JVM。
使用了JVM之後,java只需要編譯成JVM中識別的位元組碼就可以了,然後JVM會根據運行平台,把位元組碼轉換為平台識別的電腦指令。
一次編譯,到處執行。
2)資料類型
2.1基礎資料型別 (Elementary Data Type),資料類型及位元組數。
1-----------2-----------4-----------8
byte short int long
char float double
上述7種資料類型不需要硬體標記,操作這些資料時位元組碼本身已經給出了操作類型,例如:fadd,iadd,dadd
2.2其他類型
4位元組:object類型,盛放對其他JavaObject的引用。
注意:數群組類型會被當做Object類型處理。所有的資料都應該遵守資料類型規則。否則jvm會拒絕執行位元組碼。
3)組件
為了實現跨平台的特性,JVM設計出組件標準,支撐虛擬電腦模型。
1.JVM指令系統
2.JVM寄存器
3.JVM棧結構
4.JVM片段回收堆
5.JVM儲存區-常量池
6.JVM儲存區-方法區
4)原理
JVM是Java的基礎和核心,是JAVA編譯器同作業系統及硬體平台之間的中介層,是一個抽象的電腦。
java編譯器產生JVM識別的位元組碼,JVM根據位元組碼產生作業系統的機器碼,在對應的平台上執行。
對於JAVA的程式來說,JVM是一個程式運行容器,對於作業系統而言JVM是一個進程。
4.1)執行過程--JVM初始化作業
程式執行時,首先調用JAVA.exe(java.exe是一個外殼,其實內部發生核心作用的時JVM.dll)
java_md.c,java.c兩個檔案調用jvm.cfg,進行虛擬機器的初始化,並且裝載jvm.dll。
jvm.dll掛載JNIEVE(java環境),接下來就開始載入類,進行操作。
4.2)執行過程--類載入
classLoader載入要執行的.class檔案
進行位元組碼的校正
申請並管理儲存地區,記憶體回收
使用java解譯器進行解釋,產生機器碼
作業系統執行機器碼
5)指令系統
指令系統是指令的集合,每條指令由作業碼和運算元組成。
作業碼由8位2進位數組成,最大256種,現在已經使用160種以上。
運算元根據實際變化而變化,超過8位時,新增一個位元組。
如 iadd,iand等都是作業碼。
6)寄存器
分為四種
pc 程式計數器指標
optop 運算元棧頂指標
vars 局部變數第一變數指標
frame 當前執行環境指標
*所有的寄存器都是32位
7)棧結構
類載入後會為每個方法產生一個棧結構。
包含如下幾種地區:
局部變數:儲存局部變數。以32位為單位儲存,long和double佔用兩個局部變數。vars寄存器通過位移進行局部變數的訪問。
運算元棧:以32為基礎單位。運算過程中儲存運算元以及操作結果;調用方法時傳遞參數,並放置調用結果。機器指令取資訊時,只從運算元棧取資料。
執行環境:存放解譯器所需要的各種資訊,如局部變數指標,棧頂和棧底指標,上一次執行的方法。
動態連結:以符號指標的形式存取方法和變數,並且把變數翻譯成儲存結構和位移地址。
正常返回:正常返回時,調用方會得到一個返回結果。進一步的設定調用方的寄存器,如把PC加一個適當的數,能夠進行下一個指令的訪問。
異常捕捉:程式遇到類似於無法找到class(動態連結錯),或者遇到null 指標(執行階段錯誤),接下來catch子句的匹配。
匹配原則:位元組碼發生異常的地點是catch的範圍內,異常類型是catch的類型。
匹配順序:從第一個異常catch子句到最後一個子句,逐層尋找。找到後處理catch異常塊代碼。最終匹配失敗,會執行最底層預設塊異常。
執行iadd時,需要調用寄存器frame,通過frame找到運算元棧,彈出兩個運算元。
然後把計算結果,通過寄存器frame找到運算元棧,壓倒棧頂。
8)回收堆
java類執行個體的空間由解譯器進行分配和管理的。解譯器記錄對象的記憶體空間使用方式,當記憶體不再被使用時,由解譯器負責把記憶體空間回收到堆中。
右側為自我理解:可以理解Edan地區,survival地區,old地區。按步驟使用。
new時現在edan地區申請記憶體,不足時回收edan中不用對象。
記憶體還是不足時,把部分活性不足的對象放置到survival中。
survival地區不足時,把部分活性不足的對象放置到old中。
old地區不足時,gc整個old地區。
gc後還是不足時,報異常。
9)儲存地區-常量池
儲存: 類名,方法名,欄位名稱,常量。
10)儲存池-方法區
儲存:方法執行的位元組碼。
11)Java解譯器
拿著JAVA和C++對比,可以理解如下:
Java源碼和C++源碼同樣為進階語言;
Java編譯後檔案為二進位位元組碼,C++編譯後檔案為二進位機器碼;
Java位元組碼在JVM的java解釋其中執行,C++機器碼在CPU中執行;
Java解譯器是通過軟體實現的虛擬cpu,其最終還會把位元組碼翻譯成機器碼在實際的CPU上執行;
只要運行平台上實現了java解譯器,那麼java就可以在這個平台上執行,目前部分平台不支援java,因為其沒有實現java解譯器;
12)運行資料
JVM啟動和退出時會建立和銷毀部分資料區域,線程建立和死亡時也會建立和銷毀部分資料。
包含:寄存器,棧,堆,常量池,方法區。
13)其他
13.1)當開啟新的線程時,會為線程建立java棧用以存放方法的調用狀態。注意,本地方法的調用狀態存放在棧結構的本地方法棧裡。
同時會為線程設定PC 應用程式計數器寄存器,用以放置即將執行的命令。
13.2)JVM包括子系統(載入類子系統,指令運行引擎-解譯器),指令集,資料類型,五大儲存類型(寄存器,棧,堆,方法區,常量池)等。
13.3)JRE是java平台,JavaRuntimeEnvironment,所有java程式的運行基礎。JDK安裝時,必須有一個JRE支援它,安裝了JDK後,會有一個JRE的目錄。
JVM是JRE的核心部分,它是虛擬電腦。有自己的一套組件,如CPU(指令運行引擎-JAVA解譯器),寄存器,各種儲存空間,指令集等。
參看link:
https://baike.baidu.com/item/JVM/2902369