1. 程式人生 > >詳細理解Java虛擬機的運行過程

詳細理解Java虛擬機的運行過程

擴展 依賴 完全 計數 方法 細節 運行 ack 是否

基本概述:

  Java虛擬機簡稱JVM,是JRE中的一部分,也是Java程序運行的最關鍵的部分。完整的Java運行流程大致包括編譯.java文件形成.class文件,然後根據.class文件的內容進行一系列的步驟使整個程序運行起來。其中將.java文件編譯為.class文件由Java編譯器完成,而由.class文件進而完成整個運行過程則主要是由JVM來完成的。由於所有的編譯鏈接過程都由JRE來完成,所以Java具有良好的平臺可移植性,不依賴具體的操作系統。

具體結構及功能:

1、Class Loader:

  該子系統主要負責以下三種工作。

  一、讀取(Loading):Class Loader會首先讀取由Java編譯器傳入的.class文件,然後生成相對應的二進制數據並將其存入方法區,這其中生成的數據主要包括類名、緊鄰的父類、各種修飾符、變量和方法的信息。在這之後,JVM會自動給這個類創建一個類型為Class的對象並存入堆中,這個對象可以被程序員調用,從而得到這個類中的相關信息(也就是上面所講的存入方法區的那些信息)。需要註意的是,一個類只會具有一個Class對象,也就是說,就算有無窮個該類的不同對象,在堆中也只會有一個對應的Class對象。

  二、鏈接(Linking):在讀取之後,Class Loader會對.class文件進行正確性驗證,看看該類是否被正確定義,同時是否被正確編譯。如果驗證成功,那麽JVM就會為類中的變量分配內存,並且初始化內存為默認值。

  三、初始化(Initialization):在這一階段,所有的靜態變量將被正確賦值,賦值的順序是按照代碼順序從前往後,從父類到子類。

  而對於Class Loader來說,其實也大致分為三類。第一類是Bootstrap Class Loader,我們可以理解為最基礎的Class Loader,因為它只會處理那些已經被完全信任的class,也就是Java的核心類;第二類是Extension Class Loader,它會處理那些被放置在指定的擴展類文件夾中的類;第三類是Application Class Loader,它處理的是外界定義的類。至於其中的具體不同呢,在此就不展開敘述了。

2、JVM Memory:

  JVM的內存區是其存放具體數據和對象的主要區域,總共由以下五部分組成。

  一、方法區(Method Area):方法區中主要存取的是Class級別的數據,包括類名,父類名,方法名,變量名和靜態變量等等。每一個JVM只有一塊方法區,所以是一個可以被所有類和進程共享的區域。

  二、堆(Heap Area):堆中存放著所有對象的信息。每一個JVM也只有一個堆,意味著堆也是被共享的。

  三、棧(Stack Area):JVM會為每一個線程開辟一個棧區,而每一個棧區中又會分成許多的塊(Block),每一個塊都代表一個方法調用,方法中的所有本地變量都會存放在棧中相對應的塊中。一旦該線程終止,那麽這個棧就會被JVM銷毀。所以棧區是不共享的。

  四、PC計數器(PC Register):記錄每一個線程當前運行到的代碼地址。顯然,每一個線程都會有一個對應的PC計數器,所以也是不共享的。

  五、本地方法區(Native Method Area):每一個線程都會有一個本地方法區,其主要存放本地方法的相關信息。

3、Execution Engine:

  運行引擎負責真正地運行.class文件,它會一行一行地讀取.class中的二進制信息,然後利用JVM Memory中的數據一條一條地執行。垃圾回收器也是在這個引擎中,它可以自動檢測不再可能被引用的已分配內存並將其回收。

  

  JVM的大致運行過程到這裏就告一段落了。當然,還有許許多多的細節在這裏沒有列出,如果有需要,查閱官方文檔是最好的辦法。

詳細理解Java虛擬機的運行過程