Java中 關于編譯(Compilation)、類加載(Class Loading) 和 運行(Execution)的詳細區別解析

以下是Java中 編譯(Compilation)類加載(Class Loading)運行(Execution) 的詳細區別解析:


1. 編譯(Compilation)

定義

將Java源代碼(.java文件)轉換為字節碼(.class文件)的過程,由javac編譯器完成。

關鍵特點
  • 發生時間:程序運行前(開發階段)。
  • 輸入/輸出:輸入是.java文件,輸出是.class文件(包含JVM可執行的字節碼)。
  • 核心任務
    • 語法檢查(如類型錯誤、語法錯誤)。
    • 優化代碼結構(如常量折疊、死代碼消除)。
  • 示例
    javac Main.java  # 編譯生成 Main.class
    
常見錯誤
  • 編譯錯誤:如缺少分號、未定義的變量、類型不匹配等。
    int x = "hello"; // 編譯錯誤:類型不兼容
    

2. 類加載(Class Loading)

定義

JVM在運行時.class文件加載到內存,并進行驗證、準備、解析和初始化的過程。

關鍵特點
  • 發生時間:程序運行時(按需加載)。
  • 核心步驟
    1. 加載(Loading):查找并加載類的二進制數據。
    2. 鏈接(Linking)
      • 驗證(Verification):確保字節碼符合JVM規范。
      • 準備(Preparation):為靜態變量分配內存并賦默認值(如int初始化為0)。
      • 解析(Resolution):將符號引用轉換為直接引用。
    3. 初始化(Initialization):執行靜態代碼塊和靜態變量的顯式賦值。
  • 觸發條件
    • 首次創建類的實例。
    • 首次訪問類的靜態成員。
    • 通過反射(如Class.forName("ClassName"))。
常見錯誤
  • 加載階段ClassNotFoundException(找不到類文件)。
  • 驗證階段VerifyError(字節碼不合法)。
  • 初始化階段ExceptionInInitializerError(靜態塊拋出異常)。

3. 運行(Execution)

定義

JVM解釋或即時編譯(JIT)字節碼,執行程序的邏輯。

關鍵特點
  • 發生時間:類加載完成后,由JVM執行引擎處理。
  • 核心機制
    • 解釋執行:逐行解釋字節碼(啟動快,執行慢)。
    • JIT編譯:將熱點代碼編譯為本地機器碼(執行快,占用內存)。
  • 輸入:已加載到內存的字節碼。
  • 輸出:程序的實際運行結果。
常見錯誤
  • 運行時異常:如NullPointerExceptionArrayIndexOutOfBoundsException
  • 邏輯錯誤:代碼功能不符合預期(如死循環)。

三者的區別總結

維度編譯類加載運行
發生時間程序運行前(開發階段)運行時(按需加載)運行時(類加載完成后)
主要工具/機制javac編譯器JVM的類加載器(Bootstrap、Ext、App)JVM執行引擎(解釋器、JIT)
核心任務生成字節碼,檢查語法錯誤加載、鏈接、初始化類執行字節碼,處理業務邏輯
錯誤類型語法錯誤、類型不匹配ClassNotFoundExceptionNoClassDefFoundErrorNullPointerException、邏輯錯誤

示例流程

  1. 編寫代碼

    // Main.java
    public class Main {static { System.out.println("靜態塊初始化"); }public static void main(String[] args) {System.out.println("Hello World");}
    }
    
  2. 編譯

    javac Main.java  # 生成 Main.class
    
  3. 類加載(運行java Main時):

    • 加載Main.class
    • 鏈接(驗證、準備靜態變量)。
    • 初始化(執行靜態塊,輸出靜態塊初始化)。
  4. 運行

    • 執行main方法,輸出Hello World

總結

  • 編譯是代碼到字節碼的轉換,解決語法問題。
  • 類加載是JVM在運行時動態加載類的機制,確保類的正確性。
  • 運行是字節碼的實際執行,處理程序邏輯和異常。

理解這三者的區別,能幫助開發者更好地調試程序(如區分編譯錯誤和運行時錯誤),并優化類加載機制(如減少啟動時間)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【KWDB 創作者計劃】_深度學習篇---松科AI加速棒

文章目錄 前言一、簡介二、安裝與配置硬件連接驅動安裝軟件環境配置三、使用步驟初始化設備調用SDK接口檢測設備狀態:集成到AI項目四、注意事項兼容性散熱固件更新安全移除五、硬件架構與技術規格核心芯片專用AI處理器內存配置接口類型物理接口虛擬接口能效比散熱設計六、軟件…

如何清理Windows系統中已失效或已刪除應用的默認打開方式設置

在使用Windows系統的過程中,我們可能會遇到一些問題:某些已卸載或失效的應用程序仍然出現在默認打開方式的列表中,這不僅顯得雜亂,還可能影響我們快速找到正確的程序來打開文件。 如圖,顯示應用已經被geek強制刪除&am…

NFC碰一碰發視頻推廣工具開發注意事項丨支持OEM搭建

隨著線下門店短視頻推廣需求的爆發,基于NFC技術的“碰一碰發視頻”推廣工具成為商業熱點。集星引擎在開發同類系統時,總結出六大核心開發注意事項,幫助技術團隊與品牌方少走彎路,打造真正貼合商戶需求的實用型工具: 一…

pgsql中使用jsonb的mybatis-plus和Spring Data JPA的配置

在pgsql中使用jsonb類型的數據時,實體對象要對其進行一些相關的配置,而mybatis和jpa中使用各不相同。 在項目中經常會結合 MyBatis-Plus 和 JPA 進行開發,MyBatis_plus對于操作數據更靈活,jpa可以自動建表,兩者各取其…

kotlin + spirngboot3 + spring security6 配置登錄與JWT

1. 導包 implementation("com.auth0:java-jwt:3.14.0") implementation("org.springframework.boot:spring-boot-starter-security")配置用戶實體類 Entity Table(name "users") data class User(IdGeneratedValue(strategy GenerationType.I…

【JavaWeb后端開發03】MySQL入門

文章目錄 1. 前言1.1 引言1.2 相關概念 2. MySQL概述2.1 安裝2.2 連接2.2.1 介紹2.2.2 企業使用方式(了解) 2.3 數據模型2.3.1 **關系型數據庫(RDBMS)**2.3.2 數據模型 3. SQL語句3.1 DDL語句3.1.1 數據庫操作3.1.1.1 查詢數據庫3.1.1.2 創建數據庫3.1.1…

人工智能在智能家居中的應用與發展

隨著人工智能(AI)技術的飛速發展,智能家居逐漸成為現代生活的重要組成部分。從智能語音助手到智能家電,AI正在改變我們與家居環境的互動方式,讓生活更加便捷、舒適和高效。本文將探討人工智能在智能家居中的應用現狀、…

【EasyPan】項目常見問題解答(自用持續更新中…)

EasyPan 網盤項目介紹 一、項目概述 EasyPan 是一個基于 Vue3 SpringBoot 的網盤系統,支持文件存儲、在線預覽、分享協作及后臺管理,技術棧涵蓋主流前后端框架及中間件(MySQL、Redis、FFmpeg)。 二、核心功能模塊 用戶認證 注冊…

4.1騰訊校招簡歷優化與自我介紹攻略:公式化表達+結構化呈現

騰訊校招簡歷優化與自我介紹攻略:公式化表達結構化呈現 在騰訊校招中,簡歷是敲開面試大門的第一塊磚,自我介紹則是展現個人魅力的黃金30秒。本文結合騰訊面試官偏好,拆解簡歷撰寫公式、自我介紹黃金結構及分崗位避坑指南&#xf…

【Easylive】consumes = MediaType.MULTIPART_FORM_DATA_VALUE 與 @RequestPart

【Easylive】項目常見問題解答(自用&持續更新中…) 匯總版 consumes MediaType.MULTIPART_FORM_DATA_VALUE 的作用 1. 定義請求的數據格式 ? 作用:告訴 Feign 和 HTTP 客戶端,這個接口 接收的是 multipart/form-data 格式的…

OpenSSL1.1.1d windows安裝包資源使用

環境: QT版本:5.14.2 用途: openssl1.1.1d版本 問題描述: 今天嘗試用百度云人臉識別api搭載QT的人臉識別程序,需要用到 QNetworkManager 訪問 https 開頭的網址。 但是遇到了QT缺乏 openssl 的相關問題,找了大半天…

代碼實戰保險花銷預測

文章目錄 摘要項目地址實戰代碼(初級版)實戰代碼(進階版) 摘要 本文介紹了一個完整的機器學習流程項目,重點涵蓋了多元線性回歸的建模與評估方法。項目詳細講解了特征工程中的多項實用技巧,包括&#xff1…

RS232 串行通信:C++ 實現指南

文章目錄 一、RS232 簡介1. 電氣特性2. 傳輸速率3. 傳輸距離 二、在 C 中實現 RS232 通信1. Windows 平臺(1)打開串行端口(2)配置串行通信參數(3)發送數據(4)接收數據(5&…

Linux指令合集

一、VI的使用 命令行模式:默認此模式,從輸入模式回到命令行模式:esc , esc按完,insert消失 輸入模式:按 i 進入 , 看到insert就能編輯代碼 退出vi 保存代碼 命令行模式下 按&#xf…

IDEA使用jclasslib Bytecode Viewer查看jvm字節碼

學習jvm的時候,想查看字節碼和局部變量表,可以使用idea安裝jclasslib Bytecode View插件查看。 (1)安裝工具: 安裝完成后需要重啟idea. (2)準備一段代碼,編譯運行 package com.te…

從多個Excel批量篩查數據后合并到一起

這篇文章將講解如何批量的從多個Excel文件中篩選出需要的數據,最后合并到一張新的Excel。 全程0代碼圖形化界面操作。 準備數據 這里準備了3個測試文件,每個文件的格式是一樣的 現在我們需要篩選出每個文件里面,基金簡稱包含“南方遠見”&a…

Debian GNU/Linux的新手入門介紹

Debian GNU/Linux:起源、基本介紹與發行版對比 一、起源與發展歷程 Debian GNU/Linux 是現存最古老的 Linux 發行版之一,由 Ian Murdock 于 1993 年 8 月 16 日創立。其名稱結合了他的女友(后成為妻子)Debra 和他自己的名字 Ian…

Sentinel源碼—7.參數限流和注解的實現一

大綱 1.參數限流的原理和源碼 2.SentinelResource注解的使用和實現 1.參數限流的原理和源碼 (1)參數限流規則ParamFlowRule的配置Demo (2)ParamFlowSlot根據參數限流規則驗證請求 (1)參數限流規則ParamFlowRule的配置Demo 一.參數限流的應用場景 二.參數限流規則的屬性 …

多數據源配置(MyBatis-Plus vs AbstractRoutingDataSource)

MyBatis-Plus vs AbstractRoutingDataSource MyBatis-Plus多數據源配 1.添加依賴 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> <…

聊透多線程編程-線程互斥與同步-13. C# Mutex類實現線程互斥

目錄 一、什么是臨界區&#xff1f; 二、Mutex類簡介 三、Mutex的基本用法 解釋&#xff1a; 四、Mutex的工作原理 五、使用示例1-保護共享資源 解釋&#xff1a; 六、使用示例2-跨進程同步 示例場景 1. 進程A - 主進程 2. 進程B - 第二個進程 輸出結果 ProcessA …