天天看點

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

1、HotSpot JVM标準結構

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

最上層:javac編譯器将編譯好的位元組碼class檔案,通過java 類裝載器 執行機制,把對象或class檔案 存放在 jvm劃分記憶體區域

中間層:從左至右  方法區(持久代也叫非堆)、堆(共享,GC回收對象區域)、棧、程式計數器和寄存器、本地棧(私有)

最下層:jvm最核心兩塊 JIT(just in time)即時編譯器 和 GC(Garbage Collection,垃圾回收器)

java執行流程:

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

2.運作時資料區域Runtime Data Areas

 2.1 JVM是什麼?

 官方的說法:“Java 虛拟機具有一個堆,堆是運作時資料區域,所有類執行個體和數組的記憶體均從此處配置設定。堆是在 Java 虛拟機啟動時建立的。”“在JVM中堆之外的記憶體稱為非堆記憶體(Non-heap memory)”。

JVM主要管理兩種類型的記憶體:堆和非堆。

堆就是Java代碼可及的記憶體,是留給開發人員使用的;

非堆就是JVM留給 自己用的,是以方法區、JVM内部處理或優化所需的記憶體(如JIT編譯後的代碼緩存)、每個類結構(如運作時常數池、字段和方法資料)以及方法和構造方法 的代碼都在非堆記憶體中。

2.2 堆記憶體配置設定?

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

記憶體計算公式:

總記憶體 = 堆記憶體(Xmx)+方法區記憶體(MaxPermSize)+棧記憶體(Xss)*線程數+直接記憶體(MaxDirectMemorySize,堆外)+虛拟機記憶體

  1. 配置程式JVM參數如下: -Xmx20M -Xms20M -Xmn10M -XX:SurvivorRatio=8 -XX:PermSize=10M -XX:MaxPermSize=10M  -Xss512k
  2. 實際記憶體配置設定:
           PS Young Generation(10M ,eden:from survivor:to survivor=8:1:1)
                     Eden Space: 8M    From Space:(1.0MB)  To Space:(1.0MB)
           PS Old Generation (10M)
           PS Perm Generation(10M)      

 2.3 堆記憶體參數設定?

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

詳細參數配置參考:

3.執行引擎(Execution Engine)

 3.1 解釋器和JIT執行原理

       java檔案轉化為機器碼過程:

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

      interpreter:解釋器

      JIT:即時編譯器

  通過類裝載器裝載的,被配置設定到JVM的運作時資料區的位元組碼會被執行引擎執行。執行引擎以指令為機關讀取Java位元組碼。它就像一個CPU一 樣,一條一條地執行機器指令。每個位元組碼指令都由一個1位元組的操作碼和附加的操作數組成。執行引擎取得一個操作碼,然後根據操作數來執行任務,完成後就繼 續執行下一條操作碼。

  不過Java位元組碼是用一種人類可以讀懂的語言編寫的,而不是用機器可以直接執行的語言。是以,執行引擎必須把位元組碼轉換成可以直接被JVM執行的語言。位元組碼可以通過以下兩種方式轉換成合适的語言。

  • 解釋器(解釋執行):一條一條地讀取,解釋并且執行位元組碼指令。因為它一條一條地解釋和執行指令,是以它可以很快地解釋位元組碼,但是執行起來會比較慢。這是解釋執行的語言的一個缺點。位元組碼這種“語言”基本來說是解釋執行的。
  • 即時(Just-In-Time)編譯器(編譯執行): 即時編譯器被引入用來彌補解釋器的缺點。執行引擎首先按照解釋執行的方式來執行,然後在合适的時候,即時編譯器把整段位元組碼編譯成本地代碼。然後,執行引 擎就沒有必要再去解釋執行方法了,它可以直接通過本地代碼去執行它。執行本地代碼比一條一條進行解釋執行的速度快很多。編譯後的代碼可以執行的很快,因為 本地代碼是儲存在緩存裡的。

  

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

        不過,用JIT編譯器來編譯代碼所花的時間要比用解釋器去一條條解釋執行花的時間要多。是以,如果代碼隻被執行一次的話,那麼最好還是解釋執行而不是編譯後再執行。是以,内置了JIT編譯器的JVM都會檢查方法的執行頻率,如果一個方法的執行頻率超過一個特定的值的話,那麼這個方法就會被編譯成本地代碼。

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

圖 7:Java編譯器和JIT編譯器

  JVM規範沒有定義執行引擎該如何去執行。是以,JVM的提供者通過使用不同的技術以及不同類型的JIT編譯器來提高執行引擎的效率。

  大部分的JIT編譯器都是按照下圖的方式來執行的:

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

圖 8: JIT編譯器

  JIT編譯器把位元組碼轉換成一個中間層表達式,一種中間層的表示方式,來進行優化,然後再把這種表示轉換成本地代碼。

  Oracle Hotspot VM使用一種叫做熱點編譯器的JIT編譯器。它之是以被稱作”熱點“是因為熱點編譯器通過分析找到最需要編譯的“熱點”代碼,然後把熱點代碼編譯成本地代碼。如果已經被編譯成本地代碼的位元組碼不再被頻繁調用了,換句話說,這個方法不再是熱點了,那麼Hotspot VM會把編譯過的本地代碼從cache裡移除,并且重新按照解釋的方式來執行它。Hotspot VM分為Server VM和Client VM兩種,這兩種VM使用不同的JIT編譯器。

JAVA虛拟機-Java體系結構及hotspot介紹(一)1、HotSpot JVM标準結構 2.運作時資料區域Runtime Data Areas3.執行引擎(Execution Engine)

Figure 9: Hotspot Client VM and Server VM

  Client VM 和Server VM使用完全相同的運作時,不過如上圖所示,它們所使用的JIT編譯器是不同的。Server VM用的是更進階的動态優化編譯器,這個編譯器使用了更加複雜并且更多種類的性能優化技術。

  IBM 在IBM JDK 6裡不僅引入了JIT編譯器,它同時還引入了AOT(Ahead-Of-Time)編譯器。它使得多個JVM可以通過共享緩存來共享編譯過的本地代碼。簡而言之,通過AOT編譯器編譯過的代碼可以直接被其他JVM使用。除此之外,IBM JVM通過使用AOT編譯器來提前把代碼編譯器成JXE(Java EXecutable)檔案格式來提供一種更加快速的執行方式。

  大部分Java程式的性能都是通過提升執行引擎的性能來達到的。正如JIT編譯器一樣,很多優化的技術都被引入進來使得JVM的性能一直能夠得到提升。最原始的JVM和最新的JVM最大的差别之處就是在于執行引擎。

  

 相關文章:

  • JAVA虛拟機-JMM記憶體模型(六)
  • JAVA虛拟機-JVM性能調優(五)
  • JAVA虛拟機-G1 Heap Structure(四)
  • JAVA虛拟機-CMS Heap Structure(三)
  • JAVA虛拟機-GC介紹和垃圾算法了解(二)
  • JAVA虛拟機-Java體系結構及hotspot介紹(一)

 詳細可參考:

oracle官網:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide

并發程式設計網: 

Java HotSpot VM中的JIT編譯

JVM性能優化(一)JVM技術入門

csdn:

深入了解JVM内幕