第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

JVM 整體架構(gòu)

1. 前言

本節(jié)內(nèi)容主要是介紹 JVM 的整體架構(gòu),對 JVM 有一個宏觀的認(rèn)識,是本套課程的基礎(chǔ)知識部分,雖然為基礎(chǔ)知識,但是對整體架構(gòu)的理解,是學(xué)習(xí) JVM 課程的前提,所以要重視本節(jié)的內(nèi)容學(xué)習(xí)。本節(jié)主要知識點如下:

  • 認(rèn)識 JVM 整體結(jié)構(gòu),對 JVM 的各個模塊作用有一個初步的了解,為本節(jié)基礎(chǔ)內(nèi)容;
  • 對「類加載子系統(tǒng)模塊」,進(jìn)行更加細(xì)粒度的模塊劃分介紹,重點從概念層面掌握類加載的步驟,為本節(jié)重點內(nèi)容之一;
  • 對「運行時數(shù)據(jù)區(qū)」進(jìn)行更加細(xì)粒度的模塊劃分介紹,重點先從概念層面,了解運行時數(shù)據(jù)區(qū)的五大模塊定義及作用,為本節(jié)重點內(nèi)容之一;
  • 對「執(zhí)行引擎」進(jìn)行更加細(xì)粒度的模塊劃分介紹,重點先從概念層面,了解執(zhí)行引擎的三大模塊定義及作用,其中包括垃圾回收器的初步介紹,為本節(jié)重點內(nèi)容之一;
  • 了解 JVM 的生命周期,可視作本節(jié)課程的次重點內(nèi)容。

本節(jié)內(nèi)容是我們初次了解 JVM 整體架構(gòu),以及各模塊的定義及作用,從概念的角度去了解 JVM 的各個模塊,為我們后續(xù)對各模塊的深入學(xué)習(xí)打下了良好的基礎(chǔ)。

2. JVM 整體架構(gòu)

我們首先來看看,JVM 的整體結(jié)構(gòu)圖,然后對每一個結(jié)構(gòu)模塊進(jìn)行簡單的介紹。

圖片描述

從結(jié)構(gòu)中可以看出,JVM 結(jié)構(gòu)主要分為以上幾個模塊,其中部分重點模塊內(nèi)部還會細(xì)分責(zé)任更加明細(xì)的模塊,此處先來簡單了解下每個模塊的作用。

  • Class 文件:主要指編譯成字節(jié)碼的 Java 文件,Class 文件才是 JVM 可以識別的文件,所以 Java 文件需要先進(jìn)行編譯才可進(jìn)入 JVM 執(zhí)行;
  • 類加載子系統(tǒng):類的加載,主要負(fù)責(zé)從文件系統(tǒng),或者網(wǎng)絡(luò)中加載 Class 信息,并與運行時數(shù)據(jù)區(qū)進(jìn)行交互;
  • 運行時數(shù)據(jù)區(qū):主要包括五個小模塊,Java 堆, Java 棧,本地方法棧,方法區(qū),寄存器。后文對細(xì)節(jié)模塊會有概念的介紹;
  • 執(zhí)行引擎:分配給運行時數(shù)據(jù)區(qū)的字節(jié)碼將由執(zhí)行引擎執(zhí)行,執(zhí)行引擎讀取字節(jié)碼并逐個執(zhí)行。垃圾回收器就是執(zhí)行引擎的一部分;
  • 本地方法接口:本機(jī)方法庫進(jìn)行交互,并提供執(zhí)行引擎所需的本機(jī)庫;
  • 本地方法庫:它是執(zhí)行引擎所需的本機(jī)庫的集合。

通過上文對JVM 整體結(jié)構(gòu)的介紹,我們對JVM有了一定的認(rèn)識。但是對于上圖所示的JVM 整體架構(gòu)圖,還是感覺很抽象,感覺并不直觀。那么我們再繼續(xù)看下圖,通過 6 個步驟,來簡單的描述下,一個 Java 文件在 JVM 中的流轉(zhuǎn)過程。

圖片描述

我們對上圖中的 6 個步驟,逐一進(jìn)行介紹:

  • 步驟 1 : 我們的 Demo.java 文件,通過 JDK 的 javac 命令,成功的被編譯成為額 Demo.class 文件;
  • 步驟 2 :JVM 有自己的類加載器,將編譯好的 Demo.class文件進(jìn)行了加載;
  • 步驟 3 :類加載器將加載的 Demo.class文件投放到了運行時數(shù)據(jù)區(qū),供程序執(zhí)行使用;
  • 步驟 4 :運行時數(shù)據(jù)區(qū)將字節(jié)碼文件,交給執(zhí)行引擎執(zhí)行;
  • 步驟 5 :執(zhí)行引擎執(zhí)行完畢,會對運行時數(shù)據(jù)區(qū)的數(shù)據(jù)進(jìn)行操作,比如說垃圾回收機(jī)制是執(zhí)行引擎的一部分,垃圾回收機(jī)制,針對的是運行時數(shù)據(jù)區(qū)的堆空間,后續(xù)我們會詳細(xì)講解;
  • 步驟 R :我們發(fā)現(xiàn)圖中有很多步驟 R ,此處 R 代表 Random,即隨機(jī)發(fā)生的步驟。其實就是我們在執(zhí)行過程中的一個本地方法的調(diào)用,只要我們的程序在運行過程中需要調(diào)用本地方法,那么步驟R就會發(fā)生。

Tips:此處僅僅是一個簡要的介紹,后文會對重點部分進(jìn)行更加細(xì)粒度的模塊介紹。此處需要同學(xué)記住整體 JVM 結(jié)構(gòu)框架,方便后續(xù)知識的學(xué)習(xí)。

3. 類加載子系統(tǒng)

Java 的動態(tài)類加載功能由類加載器子系統(tǒng)處理,處理過程包括加載、鏈接和初始化。如下圖所示,展現(xiàn)了類加載子系統(tǒng)的處理過程。

圖片描述

我們來介紹下上圖中類加載子系統(tǒng)的三個步驟:

加載:通過三種不同的類加載器對 Class 文件進(jìn)行加載,后續(xù)章節(jié)會對三種類加載器單獨進(jìn)行講解。我們也可以自定義類加載器,通過復(fù)寫 classLoader 方法可以實現(xiàn)自定義的類加載器。

鏈接:鏈接階段會對加載好的 Class 文件進(jìn)行字節(jié)碼、靜態(tài)變量、方法引用等進(jìn)行驗證和解析,為初始化做準(zhǔn)備。

初始化:類加載的最后階段,對類進(jìn)行初始化。

Tips:類加載子系統(tǒng)是非常復(fù)雜的,其實加載(Loading)和鏈接(Linking)部分還能夠進(jìn)行更加細(xì)致的過程劃分。鑒于我們剛剛接觸 JVM,此處點到即止。不過不用擔(dān)心,后續(xù)的章節(jié)會對加載(Loading)和鏈接(Linking)這兩個部分進(jìn)行更加細(xì)粒度的劃分以及更加細(xì)致的講解,我們循序漸進(jìn),步步為營。

4. 運行時數(shù)據(jù)區(qū)

如下圖運行時數(shù)據(jù)區(qū)共包含如下 5 個模塊,方法區(qū),Java 棧,本地方法棧,堆和程序計數(shù)器。

圖片描述

Tips:方法區(qū)和堆為共享內(nèi)存區(qū)域,多線程環(huán)境下共享這兩塊內(nèi)存區(qū)域。 Java 棧,本地方法棧和程序計數(shù)器為線程私有部分,私有數(shù)據(jù)對其他線程不可見。

我們下邊來介紹下運行時數(shù)據(jù)區(qū)的五個模塊:

  • 方法區(qū)(Method Area):所有的類級數(shù)據(jù)將存儲在這里,包括靜態(tài)變量。每個 JVM 只有一個方法區(qū),它是一個共享資源;

  • 堆區(qū)域(Heap Area):所有對象及其對應(yīng)的實例變量和數(shù)組將存儲在這里。每個 JVM 也只有一個堆區(qū)域。由于方法和堆區(qū)域共享多個線程的內(nèi)存,所存儲的數(shù)據(jù)不是線程安全的;

  • 棧區(qū)(Stack Area):對于每個線程,將創(chuàng)建單獨的運行時棧。對于每個方法調(diào)用,將在棧存儲器中產(chǎn)生一個條目,稱為棧幀。所有局部變量將在棧內(nèi)存中創(chuàng)建。棧區(qū)域是線程安全的,因為它不共享資源;

  • PC寄存器(PC Registers):也稱作程序計數(shù)器。每個線程都有單獨的 PC 寄存器,用于保存當(dāng)前執(zhí)行指令的地址。一旦執(zhí)行指令,PC 寄存器將被下一條指令更新;

  • 本地方法棧(Native Method stacks):本地方法棧保存本地方法信息。對于每個線程,將創(chuàng)建一個單獨的本地方法棧。

5. 執(zhí)行引擎

如下圖執(zhí)行引擎共包含如下三個模塊,解釋器,JIT 編譯器和垃圾回收器。

圖片描述

Tips:垃圾回收器是本模塊的重中之重,也是 JVM 的重中之重。后續(xù)會有專門的小節(jié)內(nèi)容對垃圾回收器進(jìn)行細(xì)致的講解。

我們下邊來介紹下執(zhí)行引擎的三個模塊:

  • 解釋器:解釋器是作用于字節(jié)碼的解釋。解釋器的缺點是當(dāng)一個方法被調(diào)用多次時,每次都需要一個新的解釋;

  • JIT 編譯器:JIT 編譯器消除了解釋器的缺點。執(zhí)行引擎將在轉(zhuǎn)換字節(jié)碼時使用解釋器的幫助,但是當(dāng)它發(fā)現(xiàn)重復(fù)的代碼時,將使用 JIT 編譯器,這提高了系統(tǒng)的性能;

  • 垃圾回收器(Garbage Collector):收集和刪除未引用的對象??梢酝ㄟ^調(diào)用 System.gc() 觸發(fā)垃圾收集。

6. 小結(jié)

本節(jié)主要是對 JVM 的整體框架進(jìn)行介紹,了解整體架構(gòu)是學(xué)習(xí) JVM 的基本前提。后續(xù)我們會對每一個模塊進(jìn)行展開講解,所有的知識點都是圍繞 JVM 的架構(gòu)展開的,本節(jié)內(nèi)容非常重要,一定要認(rèn)真的學(xué)習(xí)。