一個Java的main方法在JVM中的執行流程

一個Java的main方法在JVM中的執行流程可以分為??四大階段??:??加載 -> 鏈接 -> 初始化 -> 執行??。

// HelloWorld.java
public class HelloWorld {public static void main(String[] args) {String message = "Hello, JVM!";System.out.println(message);}
}

第一階段:加載 (Loading)

??目標:找到并加載類的二進制數據。??

  1. 1.

    ??編譯??:你執行?javac HelloWorld.java。Java編譯器將源代碼編譯成JVM能理解的字節碼,存儲在?HelloWorld.class文件中。這個文件包含了一個??類常量池(Constant Pool)??,里面有各種符號引用,比如?Hello, JVM!這個字符串的字面量、System/out/println等類名、方法名和字段名。

  2. 2.

    ??啟動JVM??:你執行?java HelloWorld。操作系統會啟動JVM進程。

  3. 3.

    ??尋找類??:JVM通過??類加載器(ClassLoader)?? 來加載?HelloWorld類。

    • ?

      ?? Bootstrap ClassLoader??:首先,啟動類加載器會去加載JAVA_HOME/lib下的核心類庫,如?java.lang包(包括Object,?String,?System等)。

    • ?

      ?? Application ClassLoader??:然后,應用程序類加載器開始工作,它在你的CLASSPATH(默認是當前目錄)下尋找?HelloWorld.class文件。

  4. 4.

    ??創建Class對象??:JVM成功讀取?HelloWorld.class的二進制字節流后,會將其轉換為??方法區(Metaspace)?? 中的運行時數據結構,并同時在 ??Java堆(Heap)?? 中創建一個?java.lang.Class對象,作為方法區這些數據的訪問入口。這個?Class對象封裝了類的所有元信息(如方法、字段等)。


第二階段:鏈接 (Linking)

??目標:將加載到方法區的二進制數據合并到JVM運行時狀態中。?? 此階段細分為三步:

  1. 1.

    ??驗證 (Verification)??:JVM會嚴格檢查?HelloWorld.class文件的格式、元數據、字節碼等是否符合規范且不會危害JVM自身安全。這是一個非常重要的安全屏障。

  2. 2.

    ??準備 (Preparation)??:JVM為??類的靜態變量(static variables)?? 在方法區分配內存并設置??初始值??(零值)。注意,這里是初始值,不是代碼中賦的值。

    • ?

      例如,如果類里有?static int value = 123;,在準備階段,value會被賦值為?0。真正的賦值?123要等到后面的初始化階段。

  3. 3.

    ??解析 (Resolution)??:JVM將??類常量池??中的??符號引用(Symbolic References)?? 替換為??直接引用(Direct References)??。

    • ?

      ??符號引用??:就是一種約定好的形式來表示引用的目標,比如?java/lang/System.out

    • ?

      ??直接引用??:就是一個直接指向目標的指針、偏移量或句柄。

    • ?

      例如,在這一步,System.out這個符號引用會被解析為?java.io.PrintStream對象在堆內存中的實際地址。


第三階段:初始化 (Initialization)

??目標:執行類的構造器?<clinit>()方法,為靜態變量賦予程序設定的初始值。??

  1. 1.

    到了這一步,JVM才開始真正執行你寫在Java代碼中的靜態語句和靜態變量賦值。

  2. 2.

    JVM會收集類中的所有??靜態變量的賦值動作??和??靜態代碼塊(static {})??,合并生成一個唯一的?<clinit>()方法。

  3. 3.

    JVM會確保?<clinit>()方法在多線程環境下被正確地加鎖同步執行,所以類初始化是線程安全的。

  4. 4.

    在我們的?HelloWorld例子中,沒有靜態變量和靜態代碼塊,所以?<clinit>()方法是空的,但這一步依然會發生。


第四階段:執行 (Execution & Runtime)

??目標:創建線程,執行字節碼。??

  1. 1.

    ??主線程??:JVM會為?main方法創建一個??主線程??。該線程擁有自己的??程序計數器(PC)?? 和 ??Java虛擬機棧(JVM Stack)??。

  2. 2.

    ??棧幀??:線程的每個方法調用都會在虛擬機棧中創建一個??棧幀(Stack Frame)??,用于存儲??局部變量表??、??操作數棧??、??動態鏈接??、??方法返回地址??等信息。main方法是程序入口,所以第一個被壓入棧的棧幀就是?main方法的棧幀。

  3. 3.

    ??執行引擎??:JVM的??執行引擎??開始解釋執行?main方法棧幀中的字節碼。

    • ?

      String message = "Hello, JVM!";

      • ?

        執行引擎遇到字面量?"Hello, JVM!"時,會去??字符串常量池(String Table,位于堆中)?? 中尋找。如果找不到,就在堆中創建一個String對象并將其引用駐留在常量池中,然后將該引用存入?main棧幀的局部變量表?message中。

    • ?

      System.out.println(message);

      • ?

        執行引擎通過之前在??解析階段??已經轉換好的??直接引用??,快速地找到?System.out對應的?PrintStream對象。

      • ?

        然后調用該對象的?println方法,將局部變量?message的引用(指向堆中的String對象)作為參數傳入。

  4. 4.

    ??本地方法調用??:println方法底層是一個??本地方法(Native Method)??,調用的是操作系統本身的IO能力,將字符串輸出到控制臺。

  5. 5.

    ??方法返回??:main方法執行完畢,其棧幀從虛擬機棧中彈出。主線程結束。

  6. 6.

    ??JVM退出??:所有??非守護線程??都結束后,JVM進程終止。

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

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

相關文章

聚焦診斷管理(DM)的傳輸層設計、診斷服務器實現、事件與通信管理、生命周期與報告五大核心模塊

聚焦診斷管理(DM)的傳輸層設計、診斷服務器實現、事件與通信管理、生命周期與報告五大核心模塊,明確 UDS(ISO 14229-1)與 SOVD(ASAM 服務化診斷)的功能邏輯、交互流程及規范性要求(SWS_DM 系列)。 1 UDS 傳輸層(UDS Transport Layer) 作為 DM 與診斷客戶端的 UDS …

關于npm的鉤子函數

一、npm scripts 的生命周期鉤子&#xff08;Lifecycle Scripts&#xff09; npm 提供了一些 ??特殊的 script 名稱??&#xff0c;它們是 ??生命周期鉤子??&#xff0c;會在特定時機 ??自動執行??。這些鉤子包括&#xff1a; 1.prepublishOnly(在 npm publish之前執…

167.在Vue3中使用OpenLayers模仿共享單車,判斷點是否放在規劃的電子圍欄內

一、前言大家好&#xff0c;這里分享一個 Vue3 OpenLayers 的小案例&#xff1a; 模仿共享單車的電子圍欄功能&#xff0c;用戶在地圖上繪制停泊點時&#xff0c;系統會自動判斷該點是否在規劃好的電子圍欄內&#xff08;多邊形或圓形&#xff09;。這個功能在實際項目中有很大…

鍵盤上面有F3,四,R,F,V,按下沒有反應,維修記錄

打開游戲&#xff0c;按了好幾遍F&#xff0c;結果都沒反應&#xff0c;但是左右上下行走是沒問題的。一臉懵逼&#xff1f;&#xff1f;&#xff1f;打開鍵盤測試網頁&#xff0c;發現有一列沒反應&#xff0c;F1不是&#xff0c;F1我定義了一個快捷鍵&#xff0c;跟測試沖突了…

8051單片機-成為點燈大師

第三章 成為點燈大師 1. 硬件設計 上一章說到&#xff0c;怎么點亮LED燈&#xff0c;很簡單啊&#xff0c;就是把P2口設置成低電平就行了。接下來讓我們更進一步&#xff0c;完成LED閃爍、流水燈實驗2. 軟件設計 2.1 LED閃爍實驗 為了使LED閃爍&#xff0c;我們自然而然的想到要…

Rust 日志庫完全指南:從入門到精通

GitHub 倉庫: https://github.com/zhouByte-hub/rust-study ? 如果這個項目對您有幫助&#xff0c;請給我一個 star&#xff01; 在 Rust 生態系統中&#xff0c;日志處理是一個至關重要的環節。無論是開發小型應用還是大型系統&#xff0c;良好的日志記錄都能幫助我們追蹤問題…

【科研繪圖系列】R語言繪制論文合集圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 數據準備與過濾 統計分析 可視化繪圖 抗藥性分析 系統發育分析 加載R包 數據下載 Supp figure 1 Fig 1a Fig 1c Fig 1d Fig 1e Fig 1f Supp figure 3 Supp figure 4 Supp figure 5…

【c++】從三個類的設計看軟件架構的哲學思考

從三個類的設計看軟件架構的哲學思考 文章目錄從三個類的設計看軟件架構的哲學思考前言一、OP類&#xff1a;系統工程的安全守護者設計特點設計哲學適用場景現實類比二、VarReviser類&#xff1a;版本控制的嚴謹管理者設計特點設計哲學適用場景現實類比三、Model類&#xff1a;…

人工智能優化SEO關鍵詞的實戰策略

本文聚焦智能技術如何革新關鍵詞優化實踐&#xff0c;系統解析提升網站排名的核心路徑。重點探討語義分析如何精準匹配用戶意圖、長尾詞智能挖掘怎樣解鎖高潛力流量&#xff0c;并詳解工具篩選高轉化關鍵詞的五大實用策略。通過實戰案例說明技術如何突破流量增長瓶頸&#xff0…

【c++】c++第一課:命名空間

文章目錄1.C的第?個程序2.命名空間2.1 namespace的價值2.2 namespace的定義2.3 命名空間使?最新的c標準&#xff08;建議收藏&#xff09; 1.C的第?個程序 C兼容C語?絕?多數的語法&#xff0c;所以C語?實現的helloworld依舊可以運?&#xff0c;C中需要把定義?件代碼后…

版本發布流程手冊:Release分支規范與Bug分級標準全解析

在軟件交付日益高頻、用戶需求快速迭代的今天&#xff0c;版本發布流程的規范性直接決定了團隊的交付效率、產品質量和用戶滿意度。然而&#xff0c;許多團隊仍面臨以下痛點&#xff1a; 發布混亂&#xff1a;分支管理隨意&#xff0c;代碼沖突頻發&#xff1b;質量失控&#…

什么是CA根證書

CA 根證書&#xff08;Certificate Authority Root Certificate&#xff09;是 數字證書體系&#xff08;PKI&#xff0c;Public Key Infrastructure&#xff09; 中的核心證書。它有幾個關鍵點&#xff1a;1. 定義 CA&#xff08;Certificate Authority&#xff09;&#xff1…

git push -u origin main 這個-u起什么作用

git push -u origin main 里的 -u 等價于 --set-upstream&#xff0c;它的作用是&#xff1a;&#x1f449; 把本地分支 main 和遠程分支 origin/main 綁定&#xff08;建立追蹤關系&#xff09;。&#x1f539; 具體效果第一次推送分支時&#xff0c;如果加了 -u&#xff1a;本…

【Unity基礎】兩個關于UGUI中Text對非英文字體支持的問題

問題1&#xff1a;Unity中為什么UGUI中的Text(Textmeshpro&#xff09;默認不支持非英文字體&#xff0c;而legacy中的text卻可以呢&#xff1f; 在Unity中&#xff0c;TextMeshPro&#xff08;TMP&#xff09;默認不支持非英文字體&#xff0c;而Legacy Text支持&#xff0c;主…

碎片時間干活的好手(requestIdleCallback)

&#x1f7e2; What —— 它是什么&#xff1f; requestIdleCallback(callback[, options]) 是瀏覽器提供的一個 API&#xff0c;用來在主線程空閑時執行一些優先級不高的任務。 它的特點&#xff1a; 異步執行&#xff1a;不會打斷關鍵的渲染、交互、動畫。節省性能&#xff1…

第三方網站測評:【WEB應用文件包含漏洞(LFI/RFI)的測試步驟】

文件包含漏洞分為本地文件包含(LFI)和遠程文件包含(RFI)兩類。LFI允許讀取服務器本地文件,RFI可執行遠程服務器上的惡意代碼。PHP應用中include()、require()等函數未正確過濾用戶輸入時易產生此類漏洞。 檢測URL中可能包含文件的參數,常見特征如下: 參數名包含file、pa…

網絡爬蟲(web crawler)

文章目錄一、什么是網絡爬蟲二、爬蟲工作流程詳解第1步&#xff1a;起始點 - URL種子庫&#xff08;Seed URLs&#xff09;第2步&#xff1a;大腦 - 調度器&#xff08;Scheduler&#xff09;第3步&#xff1a;雙手 - 網頁下載器&#xff08;Downloader&#xff09;第4步&#…

redis的高可用(哨兵)

Redis 的主從復制模式下&#xff0c;一旦主節點由于故障不能提供服務&#xff0c;需要人工進行主從切換&#xff0c;同時大量的客戶端需要被通知切換到新的主節點上&#xff0c;對于上了一定規模的應用來說&#xff0c;這種方案是無法接受的&#xff0c;于是Redis從2.8開始提供…

安徽某能源企業積極推進運維智能化轉型,引入高壓配電房機器人巡檢系統

在工業自動化與智能化深度融合的當下&#xff0c;機器人技術已成為能源行業提質增效的關鍵支撐。特別是在配電房這類高壓電力核心區域的運維工作中&#xff0c;傳統人工巡檢不僅面臨效率低下、巡檢周期長的困境&#xff0c;更因人員直接接觸高壓設備而存在極高的安全風險。此&a…

數據結構_二叉平衡樹

#include <stdio.h> #include <stdlib.h> #define max(a,b) ((a > b)? (a):(b))//平衡二叉樹的節點結構 typedef struct AVL_TreeNode{int data; //數據域struct AVL_TreeNode* l;struct AVL_TreeNode* r;int h;//記錄樹的高度&#xff0c;用于計算平衡因子 }…