天天看點

JVM學習筆記(二)------Java代碼編譯和執行的整個過程【轉】

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

Java代碼編譯是由Java源碼編譯器來完成,流程圖如下所示:

JVM學習筆記(二)------Java代碼編譯和執行的整個過程【轉】

Java位元組碼的執行是由JVM執行引擎來完成,流程圖如下所示:

JVM學習筆記(二)------Java代碼編譯和執行的整個過程【轉】

Java代碼編譯和執行的整個過程包含了以下三個重要的機制:

Java源碼編譯機制

類加載機制

類執行機制

Java 源碼編譯由以下三個過程組成:

分析和輸入到符号表

注解處理

語義分析和生成class檔案

流程圖如下所示:

JVM學習筆記(二)------Java代碼編譯和執行的整個過程【轉】

最後生成的class檔案由以下部分組成:

結構資訊。包括class檔案格式版本号及各部分的數量與大小的資訊

中繼資料。對應于Java源碼中聲明與常量的資訊。包含類/繼承的超類/實作的接口的聲明資訊、域與方法聲明資訊和常量池

方法資訊。對應Java源碼中語句和表達式對應的資訊。包含位元組碼、異常處理器表、求值棧與局部變量區大小、求值棧的類型記錄、調試符号資訊

JVM的類加載是通過ClassLoader及其子類來完成的,類的層次關系和加載順序可以由下圖來描述:

JVM學習筆記(二)------Java代碼編譯和執行的整個過程【轉】

1)Bootstrap ClassLoader

負責加載$JAVA_HOME中jre/lib/rt.jar裡所有的class,由C++實作,不是ClassLoader子類

2)Extension ClassLoader

負責加載java平台中擴充功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包

3)App ClassLoader

負責記載classpath中指定的jar包及目錄中class

4)Custom ClassLoader

屬于應用程式根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規範自行實作ClassLoader

加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,隻要某個classloader已加載就視為已加載此類,保證此類隻所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。

JVM是基于棧的體系結構來執行class位元組碼的。線程建立後,都會産生程式計數器(PC)和棧(Stack),程式計數器存放下一條要執行的指令在方法内的偏移量,棧中存放一個個棧幀,每個棧幀對應着每個方法的每次調用,而棧幀又是有局部變量區和操作數棧兩部分組成,局部變量區用于存放方法中的局部變量和參數,操作數棧中用于存放方法執行過程中産生的中間結果。棧的結構如下圖所示:

JVM學習筆記(二)------Java代碼編譯和執行的整個過程【轉】

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/5884570.html,如需轉載請自行聯系原作者