Java基礎學習總結(121)——Java JVM執行流程

一杯甜酒發表於2017-12-05
一、JVM的體系結構


類裝載系統

    1、定位和匯入二進位制class檔案
    2、驗證匯入類的正確性
    3、為類分配初始化記憶體
    4、幫助解析符號引用
執行引擎
    執行包在裝載類的方法中的指令,也就是方法
執行區資料
    虛擬機器會在整個計算機記憶體中開闢一塊記憶體儲存JVM需要用到的物件,變數等,執行區資料有分很多小區,分別為:方法區,虛擬機器棧,本地方法棧,堆,程式計數器。
GC
    垃圾回收器,是負責回收記憶體中無用的物件,就是這些物件沒有任何引用了,它就會被視為垃圾,也就會被刪除。
二、類在JVM的執行流程
那麼類在JVM的執行流程是怎麼做的呢?共有三步:載入、連結和初始化。
載入
JVM將java類的二進位制形式載入到記憶體中,並將他快取在記憶體中,以便後面使用,如果沒有找到指定的類就會丟擲異常classNotFound,程式在這裡結束。沒有錯誤就繼續在Java堆中生成一個代表這個類的java.lang.Class物件,作為方法區域資料的訪問入口。
連結
這個階段做三件事:驗證、準備和解析(可選)。
驗證是JVM根據java語言和JVM的語義要求檢查這個二進位制形式。例如,如果篡改經過編譯後的類檔案,那麼這個類檔案可能就不能使用了。
準備是指準備要執行的指定的類,準備階段為變數分配記憶體並設定靜態變數的初始化。在這個階段分配的僅為類的變數(static修飾的變數),而不包括類的例項變數。對非final的變數,JVM會將其設定成“零值”,而不是其賦值語句的值:
public static int num = 8;
那麼在這個階段,num的值為0,而不是8。 final修飾的類變數將會賦值成真實的值。
解析是檢查指定的類是否引用了其他的類/介面,是否能找到和載入其他的類/介面。這些檢查將針對被引用的類/介面遞迴進行,JVM的實施也可以在後面階段執行解析,即正在執行的程式碼真正要使用被引用的類/介面的時候。
初始化
在這最後一步中,JVM用賦值或者預設值將靜態變數初始化,初始化發生在執行main方法之前。在指定的類初始化前,會先初始化它的父類,此外,在初始化父類時,父類的父類也要這樣初始化。這個過程是遞迴進行的。
簡而言之,整個流程是將類存進記憶體中,檢查類的對應呼叫的類和介面是否可正常使用,再對類進行初始化的過程。
類在JVM執行流程
三、Java程式碼編譯和執行的整個過程
Java程式碼編譯是由Java原始碼編譯器來完成,流程圖如下所示:
Java位元組碼的執行是由JVM執行引擎來完成,流程圖如下所示:
四、總結
Java虛擬機器的生命週期 一個執行中的Java虛擬機器有著一個清晰的任務:執行Java程式。
程式開始執行時他才執行,程式結束時他就停止。你在同一臺機器上執行三個程式,就會有三個執行中的Java虛擬機器。
Java虛擬機器總是開始於一個main()方法,這個方法必須是公有、返回void、直接受一個字串陣列。在程式執行時,你必須給Java虛擬機器指明這個包換main()方法的類名。 Main()方法是程式的起點,他被執行的執行緒初始化為程式的初始執行緒。程式中其他的執行緒都由他來啟動。
Java中的執行緒分為兩種:守護執行緒(daemon)和普通執行緒(non-daemon)。守護執行緒是Java虛擬機器自己使用的執行緒,比如負責垃圾收集的執行緒就是一個守護執行緒。當然,你也可 以把自己的程式設定為守護執行緒。包含Main()方法的初始執行緒不是守護執行緒。
只要Java虛擬機器中還有普通的執行緒在執行,Java虛擬機器就不會停止。如果有足夠的許可權,你可以呼叫exit()方法終止程式。

相關文章