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的寫入文件的幾種方法分享
※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編譯增強技術