每日面試題11:JVM

深入理解JVM:Java的“心臟”如何驅動程序運行?

為什么需要JVM?

你是否想過,為什么用Java寫的程序,能在Windows、Linux、macOS上“無縫運行”?為什么開發者無需為不同操作系統重寫代碼?這背后的核心功臣,正是Java虛擬機(Java Virtual Machine,JVM)。

JVM是Java生態的“基石”,它不僅實現了“一次編寫,隨處運行”的跨平臺特性,還通過內存管理、垃圾回收等機制,讓開發者從繁瑣的系統底層操作中解放出來,專注于業務邏輯。今天,我們就從JVM的核心架構出發,了解什么是JVM。

l


一、JVM的本質:字節碼的“翻譯官”與資源管家

1.1 JVM的核心職責

JVM本質上是一個??虛擬計算機??,它通過以下機制支撐Java程序的運行:

  • ??執行字節碼??:將Java源碼編譯后的.class字節碼文件,翻譯為具體操作系統能識別的機器碼。
  • ??內存管理??:自動分配對象內存、回收無用內存(垃圾回收),避免手動內存操作(如C++的new/delete)帶來的內存泄漏或越界問題。
  • ??跨平臺支持??:通過不同平臺的JVM實現(如Windows版、Linux版JVM),屏蔽底層系統差異,實現“一次編譯,到處運行”。

1.2 Java代碼的執行全流程

理解JVM的作用,需先看Java代碼的“生命周期”:

// 示例Java代碼
public class HelloJVM {public static void main(String[] args) {System.out.println("Hello, JVM!");}
}

??步驟1:編譯為字節碼??
通過javac HelloJVM.java命令,將Java源碼編譯為.class字節碼文件(二進制格式,與平臺無關)。

??步驟2:JVM加載并執行字節碼??
JVM讀取.class文件,將其翻譯為對應操作系統的機器碼,最終由CPU執行。

??關鍵優勢??:無論目標系統是Windows還是Linux,只需安裝對應版本的JVM,同一個.class文件就能運行——這就是“跨平臺”的本質。


二、JVM的核心架構:運行時數據區(內存結構)

JVM的內存結構是其核心組件之一,用于存儲程序運行時的各類數據。根據功能不同,可分為五大區域(JDK8后部分區域名稱調整):

2.1 程序計數器(Program Counter Register)

  • ??定位??:線程私有(每個線程獨立一份)。
  • ??功能??:記錄當前線程執行的??字節碼指令地址??(類似“執行指針”)。
  • ??特點??:
    • 若執行的是Java方法,計數器存儲當前字節碼的行號;若執行的是本地(Native)方法(如C/C++實現的方法),計數器值為Undefined
    • 唯一不會發生OutOfMemoryError(OOM)的區域。

??類比??:就像閱讀時做的“書簽”,記錄當前讀到哪一頁,下次繼續從這里開始。

2.2 虛擬機棧(Java Virtual Machine Stack)

  • ??定位??:線程私有(每個線程獨立棧空間)。
  • ??功能??:存儲??方法調用的局部變量、操作數棧、動態鏈接、方法返回地址??等信息。
  • ??結構??:
    每個方法調用會創建一個“棧幀”(Stack Frame),包含:
    • ??局部變量表??:存儲方法參數、局部變量(基本類型直接存值,引用類型存對象地址)。
    • ??操作數棧??:方法執行時的臨時計算空間(如a + b會將a、b壓棧,計算后彈出結果)。
    • ??動態鏈接??:指向方法區(元空間)中該方法的符號引用(運行時解析為直接引用)。
  • ??常見問題??:
    • ??棧溢出(StackOverflowError)??:棧深度超過限制(如遞歸調用過深)。
    • ??OOM(OutOfMemoryError)??:棧空間擴展失敗(如不斷創建線程導致棧總空間耗盡)。

??示例??:調用methodA()時,棧中會壓入methodA的棧幀;若methodA調用methodB(),則繼續壓入methodB的棧幀,執行完methodB后彈出其棧幀,回到methodA

2.3 堆(Heap)

  • ??定位??:線程共享(所有線程可訪問同一堆空間)。
  • ??功能??:存儲??對象實例、數組??等幾乎所有對象(除基本類型變量和對象引用外)。
  • ??特點??:
    • 是JVM內存管理的核心區域,也是垃圾回收(GC)的主要目標區域。
    • 堆內存不足時會拋出OutOfMemoryError: Java heap space
  • ??分代設計(JDK8前)??:
    為優化GC效率,堆通常分為??新生代(Young Generation)??和??老年代(Old Generation)??:
    • 新生代:存放生命周期短的對象(如局部變量),通過Minor GC(小范圍回收)快速清理。
    • 老年代:存放生命周期長的對象(如全局緩存),通過Major GC/Full GC(大范圍回收)清理。

??注意??:JDK8后,永久代(PermGen)被元空間(Metaspace)取代,但堆的核心地位未變。

2.4 元空間(Metaspace)

  • ??定位??:線程共享(存儲類級別的元數據)。
  • ??功能??:替代JDK7及之前的“永久代(PermGen)”,存儲??類的元信息??(如類名、方法定義、字段信息、常量池、靜態變量等)。
  • ??特點??:
    • 不再使用JVM堆內存,而是直接使用??本地內存??(操作系統內存),避免了永久代的內存溢出問題。
    • 常見OOM場景:類元數據占用過多內存(如動態生成大量類,Spring框架的CGLIB代理可能觸發)。

??對比永久代??:JDK7時,字符串常量池從永久代移至堆;JDK8后,永久代完全被元空間取代。


三、JVM的其他核心組件:協同工作的“引擎”

3.1 類加載器(Class Loader)

  • ??功能??:將.class字節碼文件加載到JVM內存中,并生成對應的Class對象(程序通過Class對象訪問類的方法、字段)。
  • ??加載流程??(雙親委派模型):
    1. ??啟動類加載器(Bootstrap ClassLoader)??:加載JDK核心類(如java.lang.*),由C++實現。
    2. ??擴展類加載器(Extension ClassLoader)??:加載jre/lib/ext目錄下的擴展類。
    3. ??應用類加載器(Application ClassLoader)??:加載用戶項目中的類(如src/main/java編譯后的.class文件)。
  • ??雙親委派機制??:子加載器優先委托父加載器加載類,避免重復加載和核心類被篡改(如防止用戶自定義一個java.lang.String覆蓋JDK原生類)。

3.2 執行引擎(Execution Engine)

  • ??功能??:將字節碼翻譯為機器碼并執行。
  • ??執行方式??:
    • ??解釋執行??:逐行讀取字節碼并翻譯為機器碼(啟動快,效率低)。
    • ??即時編譯(JIT, Just-In-Time)??:對高頻執行的代碼(熱點代碼)進行批量編譯,轉換為機器碼后緩存(長期執行效率高)。
  • ??優化技術??:如方法內聯(減少函數調用開銷)、逃逸分析(判斷對象是否僅在方法內使用,決定是否棧上分配)。

3.3 垃圾回收器(Garbage Collector, GC)

  • ??功能??:自動回收堆中不再使用的對象內存,避免內存泄漏。
  • ??核心算法??:
    • ??標記-清除(Mark-Sweep)??:標記無用對象后清除,但會產生內存碎片。
    • ??復制算法(Copying)??:將內存分為兩塊,每次只用一塊,回收時復制存活對象到另一塊(新生代Minor GC常用)。
    • ??標記-整理(Mark-Compact)??:標記無用對象后,將存活對象向一端移動,避免碎片(老年代Full GC常用)。
  • ??常見收集器??:如Serial(單線程)、Parallel(多線程)、CMS(并發標記清除,低延遲)、G1(分代收集,JDK9+默認)。

總結:JVM是Java世界的“操作系統”

JVM不僅是Java跨平臺的“橋梁”,更是程序運行的“資源管家”。它的核心架構(運行時數據區、類加載器、執行引擎、GC)協同工作,確保了Java程序的高效、安全與穩定。

下次遇到StackOverflowErrorOOM時,不妨回憶一下JVM的內存結構——問題可能就出在某個區域的“超載”;而理解類加載器和GC機制,則能幫你寫出更健壯、更高效的Java代碼。

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

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

相關文章

Linux網絡信息(含ssh服務和rsync)

73.telnet:測試端口連通性用法:telnet 主機名或IP 端口號測試目標主機的指定端口是否開放,檢查網絡服務連通性。eg:telnet www.baidu.com 80# 說明:# - 如果連接成功,顯示 "Connected to ..."。…

【PTA數據結構 | C語言版】我愛背單詞

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 作為一個勤奮的學生,你在閱讀一段英文文章時,是否希望有個程序能自動幫你把沒有背過的生詞列出來?本題就請你實現這個程序。 輸入格式: 輸入第 1 行給…

如何使用電腦連接小米耳機(紅米 redmi耳機)

如何使用電腦連接小米(紅米 redmi)耳機Redmi耳機連接電腦的具體步驟如下注意事項和常見問題解決方法:Redmi耳機連接電腦的具體步驟如下 打開耳機倉蓋: 首先,打開Redmi耳機的充電倉蓋,但不需要取出耳機。進…

排序算法—交換排序(冒泡、快速)(動圖演示)

目錄 十大排序算法分類?編輯 冒泡排序 算法步驟: 動圖演示: 性能分析: 代碼實現(Java): 快速排序(挖坑法) 算法步驟: 動圖演示: 性能分析&#xff1…

2023 年 5 月青少年軟編等考 C 語言八級真題解析

目錄 T1. 道路 思路分析 T2. Rainbow 的商店 思路分析 T3. 冰闊落 I 思路分析 T4. 青蛙的約會 思路分析 T1. 道路 題目鏈接:SOJ D1216 N N N 個以 1 ~ N 1 \sim N 1~N 標號的城市通過單向的道路相連,每條道路包含兩個參數:道路的長度和需要為該路付的通行費(以金幣的數…

【vue-4】深入理解 Vue 3 中的 v-for 指令

Vue.js 作為現代前端框架的代表之一,其模板指令系統提供了強大的數據綁定和渲染能力。其中,v-for 指令是 Vue 中最常用且最重要的指令之一,它允許我們基于數據源循環渲染元素或組件。在 Vue 3 中,v-for 保留了一貫的簡潔語法&…

《R for Data Science (2e)》免費中文翻譯 (第1章) --- Data visualization(1)

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github,歡迎大家參與貢獻,詳細信息見: Books-zh-cn 項目介紹: Books-zh-cn:開源免費的中文書籍社區 r4ds-zh-cn …

界面組件DevExpress WPF中文教程:Grid - 如何完成節點排序和移動?

DevExpress WPF擁有120個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

【Prometheus+Grafana篇】監控通過Keepalived實現的MySQL HA高可用架構

💫《博主主頁》:    🔎 CSDN主頁__奈斯DB    🔎 IF Club社區主頁__奈斯、 🔥《擅長領域》:擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控;并對…

k8s:利用kubectl部署postgis:17-3.5

1.離線環境CPU:Hygon C86 7285 32-core Processor 操作系統:麒麟操作系統 containerd:1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey:3.1.10 Harbor:2.13.1 Postgis:17-3.52.創建并執行postgresql-headless.yaml2.1創建apiVersion: v1…

Mysql(存儲過程)

目錄 介紹 特點 存儲過程創建 系統變量(不重要) 用戶變量 局部變量 if 判斷 參數(in, out, inout) case while repeat loop 游標和條件處理程序-handler 存儲函數 為了防止以后忘記,反復去看視頻浪費時間,特寫一篇 介紹 存儲過程…

Effective Python 第14條: 用sort方法的key參數來表示復雜的排序邏輯

一、引言:Python排序功能的重要性 在Python開發中,排序功能是一個常見的需求。無論是處理數據、優化算法,還是提升用戶體驗,排序都是不可或缺的一部分。Python的列表內置了sort方法,提供了靈活的排序功能。然而&#…

react+antd 可拖拽模態框組件

DraggableModal 可拖拽模態框組件使用說明 概述 DraggableModal 是一個基于 dnd-kit/core 實現的可拖拽模態框組件,允許用戶通過拖拽標題欄來移動模態框位置。該組件具有智能邊界檢測功能,確保模態框始終保持在可視區域內。 功能特性 ? 可拖拽移動&…

MySQL的基本操作及相關python代碼

下面為你介紹 MySQL 的基本操作,以及對應的 Python 代碼實現。我會先介紹 SQL 基本操作,再展示如何用 Python 連接 MySQL 并執行這些操作。 一、MySQL 基本操作(SQL 語句) 1. 連接數據庫 bash mysql -u root -p2. 創建數據庫 sql CREATE DATABASE testdb;3. 使用數據…

Armbian(斐訊N1)安裝xfce桌面以及遠程環境

安裝xfce桌面以及vncserver(遠程連接) 安裝xfce桌面 apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils ubuntu的安裝gdm3, apt install gdm3 debian安裝lightdm。 apt install lightdm 安裝vnc server apt-get install tightvncserver 中文字體…

【Oracle】Oracle 11g打補丁時遇到opatch apply命令無法識別

?? 1. 使用完整路徑執行命令 問題原因:若未將$ORACLE_HOME/OPatch加入系統PATH環境變量,直接輸入opatch apply會因系統無法定位命令而報錯。 解決方案: 改用絕對路徑執行: $ORACLE_HOME/OPatch/opatch apply例如: /u…

單例模式詳細講解

一.定義單例模式是一種創建型設計模式,確保一個類只有一個實例,并提供一個全局訪問點特點:1.構造函數和析構函數私有化2.禁用拷貝構造函數和賦值運算符重載(delete)3.利用靜態成員函數和靜態成員變量來給外界提供訪問二…

KORGym:評估大語言模型推理能力的動態游戲平臺

KORGym:評估大語言模型推理能力的動態游戲平臺 現有評估基準多受領域限制或 pretraining 數據影響,難以精準測LLMs內在推理能力。KORGym平臺應運而生,含50余款游戲,多維度評估,本文將深入解析其設計、框架、實驗及發現…

ISPDiffuser文章翻譯理解

ISPDiffuser: Learning RAW-to-sRGB Mappings with Texture-Aware Diffusion Models and Histogram-Guided Color Consistency翻譯 Type: Conference paper Author: Yang Ren1,4, Hai Jiang1,4, Menglong Yang1,2,?, Wei Li1,2, Shuaicheng Liu3,4,? Select: ???????…

C++線程池執行步驟分析,總結線程池流程

線程池流程總結:1、構造函數中創建線程,并添加到線程池(構造函數返回時,線程自動啟動,并停在等待wait:從線程池取出一個任務處); 2、主線程中添加任務,到任務隊列。并用“…