當前位置:
首頁 > 知識 > Java代碼編譯和執行的整 個過程

Java代碼編譯和執行的整 個過程

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

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

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

Java源碼編譯機制

類載入機制

類執行機制

Java源碼編譯機制

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

分析和輸入到符號表

註解處理

語義分析和生成class文件

流程圖如下所示:

最後生成的class文件由以下部分組成:

結構信息。包括class文件格式版本號及各部分的數量與大小的信息

元數據。對應於Java源碼中聲明與常量的信息。包含類/繼承的超類/實現的介面的聲明信息、域與方法聲明信息和常量池

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

類載入機制

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

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),程序計數器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次調用,而棧幀又是有局部變數區和操作數棧兩部分組成,局部變數區用於存放方法中的局部變數和參數,操作數棧中用於存放方法執行過程中產生的中間結果。棧的結構如下圖所示:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java吧 的精彩文章:

Java的寫入文件的幾種方法分享
2016年7 個最佳的 Java 框架
Java語言零基礎菜鳥入門Java程序學習 的要點
Java操作Excel表格的一種方法Java教程

TAG:java吧 |

您可能感興趣

使用 JITWatch 查看 JVM 的 JIT 編譯代碼
圖解教程——並行矩量法程序在Windows的編譯
自製Monkey編程語言編譯器:增加數組操作API和Mapsh數據類型
在JFinal中新建一個sql文件編譯不通過
Flutter 的編譯模式
Dropbox創建了一種新的Python編譯器:mypyc
GitHub Actions 集成 CI/CD 功能,推進開發編譯測試部署流程自動化
GitHub Actions 集成CI/CD功能,推進開發編譯測試部署流程自動化
如何 Docker 化編譯的軟體
Linux 程序編譯過程的來龍去脈
Linux查看Nginx、Apache、MySQL、PHP的編譯參數
XJar: Spring-Boot JAR 包加密運行工具,避免源碼泄露以及反編譯
帶你梳理下ARM代碼編譯與鏈接調試的工作流程
解決ReactOS Dev編譯之後功能殘缺問題
Valve為AMD GPU開發新的Mesa著色器編譯器,編譯速度更快,遊戲幀數有所提高
vivo推出ART+編譯增強Turbo技術:對標華為?
C sharp 翻身?微軟重寫開源的 C sharp 編譯器!
php+Swoole——編譯安裝
Windows 版本的 Chrome 停用微軟的編譯器 改用 Clang
vivo Z5x將首發ART+Turbo編譯增強技術