JVM學習筆記(一)——JVM結構與原理

    現在java開發崗的競爭真的是越來越激烈了,動輒都是往底層來,所以現在不得不開始JVM學習。我們首先要清楚JVM的基本結構和運行原理,才能進行更深入的學習,以下是我總結的一些JVM的基礎和原理,更詳細完整的學習還是需要多看書。

一、什麼是JVM

    JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現這一特點的關鍵。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。這就是Java的能夠“一次編譯,到處運行”的原因.

 

二、原理

   JVM是java的核心和基礎,在java編譯器和os平臺(操作系統)之間的虛擬處理器。JAVA程序不直接作用在OS平臺,而是在JVM中加載、編譯成字節碼之後,通過JVM將每一條指令翻譯成不同平臺的機器碼來運行。

   JVM執行程序的過程:

   1、加載.class文件;

   2、編譯成字節碼;

   3、管理並分配內存

   4、執行垃圾收集器。

   https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=e90e6fe694cad1c8c4b6f4751e570c6c/0b7b02087bf40ad1bb99b82a562c11dfa8eccefe.jpg

 

 

 

  

這是java1.8官方定義的JVM結構圖:

 

   JVM是Java程序運行的容器,但是他同時也是操作系統的一個進程,因此他也有他自己的運行的生命週期,也有自己的代碼和數據空間。

   我們從圖中可以看到Java Virtual Machine是定義在JDK最底層的,負責與操作系統的交互,用來屏蔽操作系統環境,提供一個完整的Java運行環境,因此也叫虛擬計算機.操作系統裝入JVM是通過jdk中Java.exe來完成,通過下面4步來完成JVM環境:

   1.創建JVM裝載環境和配置;

   2.裝載JVM.dll;

   3.初始化JVM.dll並掛接到JNIENV(JNI調用接口)實例;

   4.調用JNIEnv實例裝載並處理class類

JDK提供了兩個虛擬機:

1、針對客戶端應用程序的Java HotSpot Client VM(Client VM),客戶端虛擬機經過調整,可減少啓動時間和內存佔用,可以使用-client命令啓動它。

  2、針對所有平臺的,JDK附帶了一個Java HotSpot Server VM(Server VM)虛擬機實現。Server VM是爲了最快速的實現程序執行而設計的,可以使-server命令啓動它。

——這兩段來自JVM官方文檔

三、JVM支持的數據類型
1、基本數據類型
   byte、short、int、long、float、double、boolean、char
2、其他數據類型
    object:java數組被當做object處理
    returnAddress:用於jsr/ret/jsr-w/ret-w指令
四、JVM定義了控制Java代碼解釋執行和具體實現的五種規格:
    JVM雖然爲開發人員省去了很多事情,但是JVM在JAVA字節碼的格式中給了很明確的格式定義。這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式,以及JAVA中的java對象、常量緩衝池在JVM中的存儲映像。
  1. JVM指令系統
   Java指令是由操作碼和操作數兩部分組成,操作碼爲8位的二進制數,操作數緊隨在操作碼後面,其長度根據需要而不同。操作碼用於指定一條操作指令的性質,當前度大於8位時,操作數被分爲兩個以上的字節存放。Java指令系統是以java語言的實現爲目的設計的,其中包含調用方法和監控多線程系統的指令。Java8位操作碼的長度,使得JVM最多有256種指令。

2.JVM寄存器(32位)

    所有CPU均包含用於保存系統狀態和處理器所需信息的寄存器組,如果虛擬機定義較多的寄存器組,可以減少對棧和內存的訪問,有利於提高速度,但是過多就會佔用CPU資源。所以JVM 定義了四個寄存器:
1’pc程序計數器
2’optop操作數棧頂指針
3’frame當前操作數棧頂指針
4’vars指向當前運行環境中第一個局部變量的指針;
其中,pc用於記錄程序的執行,optop、frame、vars用於記錄指向java棧區的指針。

3.JVM棧結構

    Java棧是JVM存儲信息的主要方法,當JVM得到一個java字節碼應用程序後,便爲該代碼中一個類的每一個方法創建一個棧框架,以保存該方法的狀態信息。每個棧框架包含以下三類信息:
1’局部變量:局部變量用於存儲一個類的方法中所有的局部變量
2’執行環境:vars寄存器只想該變量表的第一個局部變量
3’操作棧:操作數棧用於存儲運算所需操作數及運算的結果

4.JVM碎片回收堆

    Java類所需要的內存空間是在堆上分配的,解釋器承擔爲類實例分配空間,分配完成之後,解釋器開始監控該對象對內存區域的使用,一旦對象使用完畢,解釋器將對象回收到堆中。Java解釋器的回收功能用後臺線程的方式來執行,不用開發人員手動執行回收。

5.JVM存儲區

   JVM有兩類存儲區:常量緩衝池和方法區。敞亮緩衝池用於存儲類名、方法和字段以及常量。方法區則用於存儲java方法的字節碼。JVM爲Java字節碼定義一套完整的規格,在具體的平臺運行則由java解釋器實現,使得java程序可以跨平臺運行。

 

參考文章:

JVM官方文檔:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/index.html

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

https://baike.baidu.com/reference/2902369/e2a5ogtPbrCMYzMTsByrIp4H3qZWEpUMIJgIvTCNs3Rwolr3rOnZmBdEpyQLcFvv7Y9PvfWW8MWam9xPMpcVBAlFUB-_ZIGU5RdjXh4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章