JVM架構哪些事

雨露發表於2019-01-19

JAVA虛擬機器

每一個java程式都是執行在某個具體的java虛擬機器實現的例項上,一個java虛擬機器負責執行一個java程式,當啟動一個java程式的時候,一個虛擬機器就誕生了,當該程式關閉時,這個虛擬機器例項也就隨之消亡。

1 JVM執行緒

  • 守護執行緒;通常是虛擬機器自己使用,比如GC執行緒,但是java程式可以將自己的執行緒設定為守護執行緒,但是必須在start()方法之前呼叫
  • 使用者執行緒:即main方法執行的執行緒

當程式中所有的非守護執行緒(即使用者執行緒)都結束時,虛擬機器例項將自動退出。因而,守護執行緒不適合做IO操作,因為守護執行緒是在所有的非守護執行緒推出後結束,這樣並不能代表守護執行緒是否完成了相應的操作,如果非守護執行緒退出後,還有大量的資料沒有寫,將會引發資料丟失問題

2 JVM結構

-類裝載子系統

每一個JVM都有一個類裝載系統,它會跟著給定的全限定名來裝載型別、class檔案等

  • 執行引擎

    每一個JVM都有一個執行引擎,他負責執行哪些包含在裝載類中的指令

  • 執行時資料區

    當JVM執行一個程式的時候,它需要記憶體來進行儲存很多的東西,比如計算時的中間變數,程式建立的物件,返回值等等,執行時資料區就類似於記憶體,存存這些東西,每個執行區包含方法區,堆,JAVA棧,PC暫存器,本地方法棧等
    (1)當虛擬機器裝載一個class檔案時,它會從class檔案包含的二進位制資料中解析型別資訊,然後將這些資訊放在方法區中

    (2)當程式執行的時候,虛擬機器就會把所有執行緒在執行時建立的物件都放在堆中

    (3)如果執行緒正在執行的是一個JAVA方法,那麼暫存器的值(程式計數器)總是指向下一條將被執行的指令

    (4)JAVA棧則總是儲存該執行緒中JAVA方法呼叫的轉檯–包括它的區域性變數、被呼叫時傳進來的引數、返回值、以及中間結果等等。JAVA棧是由很多的棧幀或這說是幀等組成,一個棧幀包含一個方法呼叫狀態,當現場呼叫一個JAVA方法的時候,虛擬機器壓入一個方法到該執行緒的JAVA棧中,當方法返回時,這個棧幀就會從JAVA棧中彈出並拋棄

3 類載入器

JAVA類載入器是JAVA執行時環境的一部分,負責動態的將JAVA類載入到JAVA虛擬機器的記憶體空間中,類通常是按需載入,即第一次使用該類時才載入,類裝載系統除了要定位和匯入二進位制class檔案外,還必須驗證被匯入類的資料的正確性,為變數分配初始化記憶體,以及幫助解析符號引用等,這些動作按照以下循序執行

(1)裝載-查詢並裝載二進位制資料

(2)連結-執行驗證、準備等

(3)初始化

4 啟動類裝載器

由原生程式碼c++編寫,它負責載入核心JAVA庫

5 使用者自定義類裝載器

繼承classloard類,使用者自定義的類裝載器

相關文章