JVM(Java 虛擬機)的介紹

JVM原理

  • JVM 核心架構與工作流程
    • 1. 類加載機制(Class Loading)
    • 2. 運行時數據區(Runtime Data Areas)
      • 堆(Heap)
      • 方法區(Method Area):元空間(Metaspace)公共區域
      • 虛擬機棧(Java Stack):線程私有
      • 程序計數器(PC Register):線程私有
      • 本地方法棧:支持 JNI(如調用 C/C++ 庫)
  • 執行引擎與性能優化
    • 1. 字節碼執行
    • 2. 垃圾回收(GC)機制
    • 3. 內存分配策略
    • 4.不同場景選擇合適的收集器組合:
  • 內存泄漏(Memory Leak) 和 內存溢出(Out of Memory, OOM)
    • 1.如何查看
    • 2. 監控與診斷工具
    • 1. 關鍵 JVM 參數
  • 性能調優實戰
    • 1. 關鍵 JVM 參數
    • 2. 監控與診斷工具
    • 3. 常見問題排查
  • JVM 新特性與趨勢(2025)
  • 總結

JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個 虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現

為什么java可以跨平臺 原因就是有JVM

JVM 核心架構與工作流程

1. 類加載機制(Class Loading)

Java編譯器(javac).java文件 -->.class文件
而類加載過程:
加載:查找 .class 文件,生成二進制數據并創建 Class 對象
鏈接:包括
驗證:檢查字節碼格式與安全性;
準備:為靜態變量分配內存并賦默認值(如 int 初始化為 0);
解析:將符號引用轉為直接引用(方法/字段的實際地址)
初始化:執行靜態代碼塊( 方法),為靜態變量賦實際值
這點可以參考static作用里面詳細介紹了
類加載器
啟動類加載器(Bootstrap):加載核心庫(java.lang 等),由 C++ 實現。
擴展類加載器(Extension):加載 jre/lib/ext 目錄的擴展類。
應用類加載器(AppClassLoader):加載用戶類路徑(ClassPath)的類。
自定義加載器:支持熱部署等場景

雙親委派模型:優先委派父加載器處理請求,避免核心類被篡改(如 java.lang.String)

2. 運行時數據區(Runtime Data Areas)

運行時數據區分類 以及對應存儲的內容
在這里插入圖片描述

堆(Heap)

存儲對象實例數組,分為 新生代(Eden + Survivor)和 老年代。

新生代:新對象分配區,采用復制算法(Minor GC)
老年代:長期存活對象區,采用標記-清除或標記-整理算法(Full GC)

方法區(Method Area):元空間(Metaspace)公共區域

JDK 8 后由 元空間(Metaspace)替代永久代
1.使用本地內存存儲了被虛擬機加載的類元信息常量靜態變量即時編譯器編譯后的代碼
加載的類元信息:包括類的名稱、方法信息、字段信息

方法區存儲方法代碼:方法區中存儲了方法的字節碼指令。當方法被調用時(即方法入口),JVM需要從方法區中讀取該方法的字節碼指令來執行,它是類級別的,與具體調用無關

2.元空間不在與堆是連續的物理內存,而是改成本內存,理論上只要本地內存足夠就不會出現OOM(OutOfMemoryError),從而盡可能避免OOfM

虛擬機棧(Java Stack):線程私有

虛擬機棧(Java Stack)存儲的是棧幀(Stack Frame)

在JVM中,每個方法在調用時都會在調用棧上創建一個棧幀(stack frame)。當方法被調用時,棧幀被創建(在入口),當方法返回時(無論是正常返回還是異常返回),棧幀被銷毀(出口)

// 方法入口
public int exampleMethod(int a) {if (a < 0) {return 0; // 一個出口}System.out.println("Positive number: " + a);return a; // 另一個出口
}

而棧幀包含了:
局部變量表:局部變量表用于存放編譯期可知的各種基本數據類型對象引用類型returnAddress類型數據,最小存儲單位為變量槽,編譯時就已確定,不受程序影響

操作數棧:操作數棧也被稱為操作棧,它是一個LIFO棧,編譯時就已確定,不受程序影響,操作數棧的每一個元素都可以是Java數據類型,32位數據類型所占棧容量為1,64位數據類型所占棧容量為2

動態連接:每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調用過程中的動態連接

方法出口:返回地址等信息,控制權返回給調用者的時刻恢復調用者的棧幀和程序計數器

注意:棧深度過大引發 StackOverflowError;擴展失敗導致 OutOfMemoryError

方法區是方法的"靜態藍圖"存儲地(字節碼、元數據)

方法入口/出口是動態執行過程:
入口時讀取方法區數據創建棧幀 → 執行中依賴方法區指令 → 出口時釋放棧幀但保留方法區數據

二者共同構成Java方法執行的完整生命周期。

程序計數器(PC Register):線程私有

記錄當前執行指令地址,唯一不會發生 OOM 的區域

本地方法棧:支持 JNI(如調用 C/C++ 庫)

主要提供本地方法

本地方法來源區分
如果方法涉及硬件、系統資源或底層調度,通常由操作系統控制
如果方法涉及 Java 運行時環境的管理,通常由 JVM 操控,如調用 C/C++ 庫

執行引擎與性能優化

1. 字節碼執行

  • 解釋器:逐行解釋字節碼,啟動快但效率低。
  • 即時編譯器(JIT):就是靜態編譯和動態編譯
    • C1 編譯器:快速編譯熱點代碼(方法調用計數器閾值 ≈1萬次),輕度優化。
    • C2 編譯器:深度優化熱點代碼(如逃逸分析、內聯優化),生成高效本地機器碼 。
    • Falcon JIT(Azul Zulu Prime):基于 LLVM,性能優于傳統 C2 。

2. 垃圾回收(GC)機制

  • 分代收集策略
    • 新生代:復制算法(對象從 Eden → Survivor 區復制)。
    • 老年代:標記-清除(碎片多)或標記-整理(碎片少)。
  • 主流垃圾收集器
    • Serial/Parallel:單線程/多線程,適合低延遲或高吞吐場景。
    • CMS:并發標記清除,減少停頓時間(但存在碎片問題)。
    • G1/ZGC:分區域收集,可預測停頓時間,兼顧吞吐與延遲 。
  • GC 觸發條件
    • Minor GC:Eden 區滿時觸發。
    • Full GC:老年代不足、元空間溢出或顯式調用 System.gc()

3. 內存分配策略

  • 對象優先分配在 Eden 區:空間不足時觸發 Minor GC。
  • 大對象直入老年代:避免在新生代頻繁復制(如長數組)。
  • 長期存活對象晉升:對象年齡(Survivor 區存活次數)超閾值(默認 15)進入老年代

4.不同場景選擇合適的收集器組合:

收集器區域算法特點
Serial新生代標記-復制單線程,簡單高效(Client模式)
Parallel Scavenge新生代標記-復制多線程,吞吐量優先
ParNew新生代標記-復制多線程版Serial,配合CMS使用
CMS老年代標記-清除并發收集,低延遲(JDK9棄用)
G1全堆分區域標記-整理可控停頓時間,JDK9+默認
ZGC全堆染色指針+讀屏障<10ms停頓,TB級堆(JDK15+)

內存泄漏(Memory Leak) 和 內存溢出(Out of Memory, OOM)

內存泄漏(Memory Leak)內存溢出(Out of Memory, OOM)是兩種不同的內存管理問題
內存泄漏是指程序在申請內存后無法釋放已申請的內存空間,導致系統可用內存逐漸減少,比如一個對象被其余對象引用導致垃圾回收器無法回收該對象所占用的內存,內存泄漏可能會隨著時間的推移逐漸惡化,最終可能導致程序性能下降或崩潰

內存溢出則是指程序在運行過程中申請的內存超出了系統分配給它的最大內存限制。這可能是由于程序需要處理的數據量過大,或者程序中存在無限循環或遞歸調用等問題。當發生內存溢出時,程序會無法繼續執行,并拋出相應的錯誤提示

1.如何查看

2. 監控與診斷工具

  • jstat:查看GC統計 ,監控堆內存與 GC 情況(如 jstat -gcutil <pid> 1000
  • jmap:生成堆轉儲快照(Heap Dump),分析內存泄漏(jmap -dump:format=b,file=heap.bin <pid>

1. 關鍵 JVM 參數

性能調優實戰

1. 關鍵 JVM 參數

-Xms2g -Xmx2g       # 堆初始/最大內存(避免動態擴容)
-XX:NewRatio=2      # 新生代:老年代 = 1:2
-XX:MaxMetaspaceSize=256m  # 限制元空間大小
-XX:+UseG1GC        # 啟用 G1 收集器
-XX:MaxGCPauseMillis=200   # 目標最大停頓時間 

2. 監控與診斷工具

  • jstat:查看GC統計 ,監控堆內存與 GC 情況(如 jstat -gcutil <pid> 1000
  • jmap:生成堆轉儲快照(Heap Dump),分析內存泄漏(jmap -dump:format=b,file=heap.bin <pid>
  • jstack:抓取線程快照,定位死鎖(jstack -l <pid>
  • Arthas:阿里開源工具,支持實時診斷 OOM、熱更新代碼

3. 常見問題排查

  • OOM(OutOfMemoryError)
    • 堆溢出java.lang.OutOfMemoryError: Java heap space → 增大 -Xmx 或分析對象生命周期
    • 元空間溢出java.lang.OutOfMemoryError: Metaspace → 調整 -XX:MaxMetaspaceSize
  • 頻繁 Full GC
    • 老年代空間不足 → 檢查對象晉升策略或內存泄漏
    • 元空間不足 → 優化類加載或調整元空間大小

JVM 新特性與趨勢(2025)

1.虛擬線程(Project Loom)

  • 輕量級線程(非 OS 線程),提升高并發應用性能(如單機支持百萬級連接)

2.ZGC 低延遲優化

  • 停頓時間控制在 1ms 內,適用于金融、實時系統 。

3.AOT 編譯(GraalVM)

  • 將字節碼預先編譯為本地機器碼,加速啟動速度(適合 Serverless 場景)

總結

JVM 作為 Java 生態的基石,通過 類加載內存管理JIT 即時編譯GC 回收 實現跨平臺與高性能。掌握其原理可有效解決 OOM、GC 停頓等問題,提升系統穩定性。未來趨勢聚焦于低延遲(ZGC)、輕量并發(虛擬線程)及原生編譯(GraalVM),持續推動 Java 在云原生場景的應用 。

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

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

相關文章

Qt 信號槽的擴展知識

Qt 信號槽的擴展知識一、信號與槽的重載Qt信號與槽的重載問題注意事項示例場景二、一個信號連接多個槽1、直接連接多個槽2、使用lambda表達式連接3、連接順序控制4、斷開特定連接5、自動連接方式三、 多個信號連接一個槽基本連接語法使用QSignalMapper區分信號源&#xff08;Qt…

鏈表算法之【合并兩個有序鏈表】

目錄 LeetCode-21題 LeetCode-21題 將兩個升序鏈表合并成一個新的升序鏈表并返回 class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if (list1 null)return list2;if (list2 null)return list1;ListNode dummyHead new ListNode();ListN…

Linux - firewall 防火墻

&#x1f525; 什么是 firewalld&#xff1f;firewalld 是一個動態管理防火墻的守護進程&#xff08;daemon&#xff09;&#xff0c;它提供了一個 D-Bus 接口來管理系統或用戶的防火墻規則。與傳統的靜態 iptables 不同&#xff0c;firewalld 支持&#xff1a;區域&#xff08…

【GESP】C++二級真題 luogu-B4356 [GESP202506 二級] 數三角形

GESP C二級&#xff0c;2025年6月真題&#xff0c;多重循環&#xff0c;難度★?☆☆☆。 題目題解詳見&#xff1a;【GESP】C二級真題 luogu-B4356 [GESP202506 二級] 數三角形 | OneCoder 【GESP】C二級真題 luogu-B4356 [GESP202506 二級] 數三角形 | OneCoderGESP C二級&…

遙感影像巖性分類:基于CNN與CNN-EL集成學習的深度學習方法

遙感影像巖性分類&#xff1a;基于CNN與CNN-EL集成學習的深度學習方法 大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下遙感影像巖性分類&#xff1a;基于CNN與CNN-EL集成學習的深度學習方法。該方法充分利用了多源遙感數據的光譜和空間信息&#xff0c;同時結合…

【STM32 學習筆記】SPI通信協議

SPI通信協議 SPI協議是由摩托羅拉公司提出的通訊協議(Serial Peripheral Interface)&#xff0c;即串行外圍設備接口&#xff0c; 是一種高速全雙工的通信總線。它被廣泛地使用在ADC、LCD等設備與MCU間&#xff0c;要求通訊速率較高的場合。 ??學習本章時&#xff0c;可與I2C…

Kafka如何做到消息不丟失

一、三種消息傳遞語義(Message Delivery Semantics):核心是“消息被消費處理的次數” Kafka的三種傳遞語義本質上描述的是“一條消息從生產到最終被消費者處理完成,可能出現的次數”,這由生產者的消息寫入可靠性和消費者的offset提交策略共同決定。 1. At most once(最…

HEVC/H.265 碼流分析工具 HEVCESBrowser 使用教程

引言 研究視頻編解碼的都知道&#xff0c;少不了各類的分析工具助力標準研究和算法開發&#xff0c;目前最出名的流媒體分析工具就是elecard系列&#xff0c;但基于一些原因可能大家用的都比較少。因此&#xff0c;找到合適的碼流分析工具才是編解碼研究的便捷途徑&#xff0c…

量子計算+AI芯片:光子計算如何重構神經網絡硬件生態

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 量子計算AI芯片&#xff1a;光子計算如何重構神經網絡硬件生態 ——2025年超異構計算架構下的萬億參數模型訓練革命 產業拐點&a…

linux 4.14 kernel屏蔽arm arch timer的方法

在 ARMv7 架構的單核 CPU 系統中&#xff0c;完全禁用 coretime 時鐘中斷&#xff08;通常是 ARM 私有定時器中斷&#xff09;需要謹慎操作&#xff0c;因為這會導致調度器無法工作&#xff0c;系統可能失去響應。以下是實現方法及注意事項&#xff1a;方法 1&#xff1a;通過 …

[實戰]調頻(FM)和調幅(AM)信號生成(完整C語言實現)

調頻&#xff08;FM&#xff09;和調幅&#xff08;AM&#xff09;信號生成 文章目錄調頻&#xff08;FM&#xff09;和調幅&#xff08;AM&#xff09;信號生成1. 調頻&#xff08;FM&#xff09;和調幅&#xff08;AM&#xff09;信號原理與信號生成調幅&#xff08;AM&#…

【LeetCode 熱題 100】21. 合并兩個有序鏈表——(解法一)迭代法

Problem: 21. 合并兩個有序鏈表 題目&#xff1a;將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(M N)空間復雜度&#xff1a;O(1)整體思路 這段代碼旨在解決…

力扣 hot100 Day40

23. 合并 K 個升序鏈表 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合并到一個升序鏈表中&#xff0c;返回合并后的鏈表。 //自己寫的垃圾 class Solution { public:ListNode* mergeKLists(vector<ListNode*>& lists) {vector<int…

validate CRI v1 image API for endpoint “unix:///run/containerd/containerd.sock“

1.現象pull image failed: Failed to exec command: sudo -E /bin/bash -c "env PATH$PATH crictl pull 172.23.123.117:8443/kubesphereio/pause:3.9"FATA[0000] validate service connection: validate CRI v1 image API for endpoint "unix:///run/container…

【會員專享數據】2013-2024年我國省市縣三級逐月SO?數值數據(Shp/Excel格式)

之前我們分享過2013-2024年全國范圍逐月SO?柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;!該數據來源于韋晶博士、李占清教授團隊發布在國家青藏高原科學數據中心網站上的中國高分辨率高質量近地表空氣污染物數據集。很多小伙伴拿到數據后反饋柵格數據不太方便使…

銳捷網絡重磅發布RG-UNC CS網絡數字化平臺:四大核心能力重塑企業網絡管理新范式

近期&#xff0c;銳捷重磅發布RG-UNC網絡數字化平臺CS系列產品&#xff0c;通過全網統一融合管理、組網編排及自動化部署、便捷準入與訪問控制、全鏈業務保障與可視四大核心能力&#xff0c;重新定義企業網絡管理標準。置身于數字化轉型的進程中&#xff0c;您的網絡是否還在面…

使用虛擬機遠程登陸ensp模擬器交換機

本文使用軟件&#xff1a;VMware&#xff0c;eNSP&#xff0c;mobaxterm要登陸ensp里面的設備&#xff0c;需要使用到cloud下面我們先搭建如下拓撲&#xff1a;首先點擊cloud&#xff0c;端口一綁定UDP信息&#xff0c;添加&#xff1b;端口2綁定VMnet8網卡&#xff08;注意網段…

顯卡GPU的架構和工作原理

顯卡GPU&#xff08;圖形處理單元&#xff09;是專為并行計算和圖形處理設計的芯片&#xff0c;廣泛應用于游戲、科學計算、人工智能和數據中心等領域。以下詳細介紹GPU的架構和工作原理&#xff0c;涵蓋核心組件、計算流程和關鍵技術&#xff0c;盡量簡潔清晰。 一、GPU架構概…

AndFix、Robust 與 Tinker 熱修復框架深度對比

AndFix、Robust 與 Tinker 熱修復框架深度對比 在 Android 熱修復領域&#xff0c;AndFix、Robust 和 Tinker 是三種主流的解決方案&#xff0c;它們在實現原理、使用場景和限制條件上有顯著差異。以下是三者的詳細對比分析&#xff1a; 一、核心原理對比特性AndFixRobustTinke…

FlashAttention 快速安裝指南(避免長時間編譯)

簡介&#xff1a;FlashAttention 編譯太慢&#xff1f;本篇提供無需編譯的預編譯 wheel 快速安裝方案&#xff0c;適配多版本 Python、PyTorch 和 CUDA&#xff0c;極大節省部署時間&#xff01; &#x1f4a1; 背景介紹 FlashAttention 是由 DAO Labs 提出的一種高性能 atten…