淺析JVM

一、JVM運行流程

如圖:
請添加圖片描述
JVM由四個部分構成:

  • 1.類加載器
    加載類文件到內存
  • 2.運行時數據區
    寫的程序需要加載到這里才能運行
  • 3.執行引擎
    負責解釋命令,提交操作系統執行
  • 4.本地接口
    融合不同編程語言為java所用,如Java程序驅動打印機

二、JVM內存區域

請添加圖片描述
其中, 方法區 是各個線程共享的一塊邏輯內存區域,它用于存儲已經被虛擬機加載的類型信息、常量、靜態變量、即使編譯器編譯后的代碼緩存等數據。方法區的實現在 Java8后的HotSpot虛擬機采用的是元空間(元空間在本地內存)。
Java8之前,HotSpot虛擬機采用的是永久代(永久代在堆內存)來實現的方法區,這樣HotSpot的垃圾收集器能夠像管理Java堆內存一樣管理這部分內存,省去了為方法區編寫內存管理代碼的工作。但是其他虛擬機實現方法區時不存在永久代的概念。

三、類加載機制

Java程序不是一次性加載所有類到內存中的。JVM在運行時按需加之類。類加載機制負責將.class文件從磁盤、網絡等地方的資源加載到JVM的方法區,并最終在堆內存中創建對應Class對象,作為訪問該類型元數據的入口。

1.類加載的生命周期

  • 1.加載
    • 任務:查找并加載類的.class文件
    • 結果:在方法區(jdk1.7)/元空間(jdk1.8)創建類運行時數據結構,并在堆內創建一個代表該類的一個java.lang.Class對象作為訪問這些數據的入口。
      java.lang.Class 對象是 Java 類的運行時表示。它包含了類的元數據(如類名、字段、方法、構造函數等信息),并且提供了訪問這些元數據的方法。通過 Class 對象,程序可以在運行時動態地獲取類的信息、創建類的實例、調用方法、訪問字段等。
  • 2.驗證:
    • 目的:確保被加載類的字節碼文件是安全、合法的,符合JVM規范的,不會危害JVM安全的。
    • 檢查內容:
      • 文件格式驗證
      • 元數據驗證(語義分析:是否有父類、是否繼承 final 類、方法覆蓋是否合法等)
      • 字節碼驗證(最復雜:檢查方法體中的指令邏輯是否合法、類型轉換是否安全、跳轉指令是否指向合理位置等)
      • 符號引用驗證(發生在解析階段,檢查符號引用能否被正確解析)
  • 3.準備:
    • 目的:為類的靜態變量分配內存(在方法區/元空間)并設置初始零值。
  • 4.解析:
    • 目的:將常量池的符號引用改成直接引用
    • 符號引用:一組符號描述引用的目標
    • 直接引用:可以是直接指向目標的指針、相對偏移量或能間接定義到目標的句柄。
    • 解析目標:類或接口、字段、類方法、接口方法、方法類型、方法句柄、調用點限定符。
  • 5.初始化:
    • 目標:執行類的初始化代碼(() 方法)。
    • () 方法:由編譯器自動收集類中所有類變量的賦值動作和靜態語句塊 (static{} 塊) 中的語句合并生成。
    • 觸發時機:首次主動創建一個類時
    • 父類優先: JVM 保證一個類的 () 方法執行前,其父類的 () 方法必須已執行完畢。
    • 線程安全:JVM 會確保 () 方法在多線程環境下被正確地加鎖同步執行(只有一個線程能執行)。
  • 6.使用
  • 7.卸載

2.類加載器

負責實現“加載”階段。JVM 內置三類重要的類加載器,它們之間存在層次關系(雙親委派模型的基礎):

  • 1.啟動類加載器(Bootstrap ClassLoader):
    • 是JVM自身的一部分
    • 加載 JAVA_HOME/lib 目錄下的核心類庫(如 rt.jar, resources.jar, charsets.jar)或 -Xbootclasspath 參數指定的路徑下的類。
  • 2.擴展類加載器(Extension ClassLoader / Platform ClassLoader - JDK9+):
    • 加載 JAVA_HOME/lib/ext 目錄或 java.ext.dirs 系統變量指定路徑下的類庫。
  • 3.應用程序加載器(Application ClassLoader / System ClassLoader):
    • 加載用戶類路徑 (ClassPath) 下的類庫。開發者編寫的類通常由此加載器加載。
    • 是程序中 ClassLoader.getSystemClassLoader() 的默認返回值。

四、雙親委派

當類加載器收到類加載請求時:

  • 1.委派父加載器:不會立刻加載職工類,而是先委派給父加載器來加載。
  • 2.遞歸委派:直到訂層的啟動類加載器
  • 3.父加載器嘗試加載:
    • 如果父加載器可以完成加載任務(在其負責的范圍內找到了該類),則成功返回該類。
    • 如果父加載器無法完成加載任務(在其負責范圍內找不到該類),則子加載器才會嘗試自己去加載。
    • 如果子加載器也找不到,則拋出 ClassNotFoundException。
      在這里插入圖片描述

優勢

  • 1.避免重復加載
  • 2.保證核心類庫安全:例如,即使你在 ClassPath 下寫了一個 java.lang.Object 類,由于雙親委派,請求會最終委派給 Bootstrap Loader,它加載了真正的核心 Object 類,你的自定義 Object 不會被加載。
  • 3.保證基礎類的統一性:確保核心類庫(如 java.lang.String)對所有子加載器可見且一致。

打破雙親委派的情況

  • SPI (Service Provider Interface): 如 JDBC。核心接口在 rt.jar 由 Bootstrap Loader 加載,但數據庫廠商的實現類在 ClassPath 下需要由 AppClassLoader 加載。為了解決這個矛盾,引入了線程上下文類加載器 (Thread Context ClassLoader, TCCL),它通常默認是 AppClassLoader。核心代碼(如 DriverManager)在需要加載 SPI 實現時,使用 TCCL 來加載。
  • 熱部署/熱替換: 如 Tomcat, OSGi。需要同一個類的不同版本共存。自定義類加載器需要能獨立加載同一類名的不同版本,不遵循父優先原則,而是先自己嘗試加載。
  • 代碼熱替換 (HotSwap): 在調試時替換修改過的類,需要類加載器能重新加載類。

五、垃圾回收機制

1.判斷對象是否存活

1.引用計數法:

  • 原理:為每個對象維護一個計數器,當對象被引用時計數器+1,引用失效時計數器-1,計數器為0時對象可回收。
  • 缺點:無法解決循環引用問題(A 引用 B,B 引用 A,但 A 和 B 都不再被外部引用,計數器不為0)。

2.可達性分析算法

  • 原理: 通過一系列稱為 “GC Roots” 的根對象作為起始點集,從這些節點開始向下搜索,搜索過程走過的路徑稱為 “引用鏈 (Reference Chain)”。如果一個對象到 GC Roots 沒有任何引用鏈相連(即不可達),則證明此對象是不可用的,可以被回收。
  • GC Roots 對象包括:
    • 虛擬機棧(棧幀中的本地變量表)中引用的對象。
    • 本地方法棧中 JNI(即 Native 方法)引用的對象。
    • 方法區中類靜態屬性引用的對象。
    • 方法區中常量引用的對象(如字符串常量池里的引用)。
    • Java 虛擬機內部的引用(如基本數據類型對應的 Class 對象,常駐的異常對象 NullPointerException、OutOfMemoryError 等,系統類加載器)。
    • 所有被同步鎖(synchronized 關鍵字)持有的對象。
    • 反映 Java 虛擬機內部情況的 JMXBean、JVMTI 中注冊的回調、本地代碼緩存等。
  • 主流 JVM 使用此方法。

3.引用類型:

  • 1.強引用:強引用不能被回收。
  • 2.軟引用:當內存不足時才會被回收。
  • 3.弱引用:下一次GC就被回收。
  • 4.虛引用:最弱的引用。無法通過虛引用獲取對象實例。唯一目的是對象被回收時收到一個系統通知。用于跟蹤對象被垃圾回收的活動。

4.垃圾回收算法

  • 1.標記清除法:
    • 步驟:遍歷GC Roots標記所有可達對象,清除所有未被標記的對象。
    • 缺點:慢,空間碎片化。
  • 2.復制算法:
    • 步驟:將可用內存按容量劃分為大小相等的兩塊(A 和 B)。每次只使用其中一塊(如 A)。當 A 用完了,就將 A 中還存活的對象復制到 B 上,然后一次性清理掉 A 上的所有空間。交換角色(現在使用 B)。
    • 優點:塊,無大量不連續碎片內存。
    • 缺點:內存縮小為原來的一半,代價高昂。適用于對象存活率低的場景(如新生代的 Eden 和 Survivor 區)。
  • 3.標記整理法:
    • 步驟:遍歷GC Roots標記所有可達對象,清除所有未被標記的對象,并且將存活對象都移動到空間的一端。
    • 優點:沒有內存碎片。
    • 缺點:移動存活對象并更新引用地址需要 STW (Stop-The-World) 時間較長。適用于對象存活率高的場景(如老年代)。
  • 4.分代收集算法:
    • 核心思想:根據對象存活周期的不同將堆劃分為新生代 (Young Generation) 和老年代 (Old Generation)。
    • 新生代特點: 對象創建頻繁,存活率低。
      • 回收算法: 主要采用復制算法(Minor GC / Young GC)。
    • 老年代特點: 對象存活周期長,存活率高。
      • 回收算法: 主要采用標記-清除或標記-整理算法(Major GC / Full GC)。

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

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

相關文章

多個 Job 并發運行時共享配置文件導致上下文污染,固化 Jenkins Job 上下文

基于 context.py 固化 Jenkins Job 上下文的完整方案,適用于你當前的工作流(Python Jenkins Pipeline),解決: 多個 Job 并發運行時共享配置文件導致上下文污染;讀取環境變量或 JSON 文件時被其他 Job 修改…

簡木易支付系統 功能齊全,對接接口超多

簡木易支付系統,作為一款引領行業潮流的卓越支付解決方案,依托先進的 PHP MySQL 技術架構精心打造。在開發過程中,它巧妙運用了功能強大的 ThinkPHP8 框架,完美融合前端主流技術 Vue、Element 以及 Layuiadmin,共同鑄…

【軟考高項論文】信息系統項目的人力資源管理

摘要 本文圍繞信息系統項目的人力資源管理展開論述。以我在2024年參與的為大型國有企業構建供應鏈管理系統項目為例,闡述了項目人力資源管理的主要流程,包括規劃、組建、建設和管理團隊四個過程,以及所運用的工具和理論。同時,分…

【EI會議征稿】東北大學主辦第三屆機器視覺、圖像處理與影像技術國際會議(MVIPIT 2025)

一、會議信息 大會官網:www.mvipit.org 官方郵箱:mvipit163.com 會議地點:遼寧沈陽 主辦單位:東北大學 會議時間:2025 年 9 月 27 日-9 月 29 日 二、征稿主題 集中但不限于“機器視覺、圖像處理與影像技術”等其…

從零開始的云計算生活——第二十三天,稍作休息,Tomcat

目錄 一.故事背景 二.Tomcat概述 1、Tomcat介紹 2、Tomcat歷史 二、Tomcat原理分析 1、Http工作原理 2、Tomcat整體架構 3、Coyote連接器架構 4、Catalina容器架構 5、Jasper處理流程 6、JSP編譯過程 7、Tomcat啟動流程 8、Tomcat請求處理流程 三、Tomcat安裝與配…

幾種基于Doherty結構的GAN氮化鎵功放設計方法介紹

功率放大器是現代無線通信系統中最重要的組件之一。理想情況下,它們能夠以高線性度和高效率提供高輸出功率。但通常在這三個關鍵的功率放大器性能參數之間需要進行權衡取舍,而且具有最高輸出功率和線性度的放大器往往會犧牲效率。 在支持寬帶寬和高數據…

前端打印計算單位 cm、mm、px

A4 縱向 寬:21cm,210mm,793.698px 高:29.7cm,297mm,1122.520px A4 橫向 寬:29.7cm,297mm,1122.520px 高:21cm,210mm,793.698px …

c# sugersql 獲取子表數據排序

在C#中使用Sugar ORM(一個流行的.NET ORM框架)獲取子表數據并進行排序,可以通過以下幾種方式實現: 1. 使用HasMany或HasOne配置 首先,確保你在配置實體時已經正確設置了HasMany或HasOne關系。例如,假設你…

【nRF52832】【環境搭建 3】【如何新建一個純單片機開發的工程】

1. 前言 笨叔,又要開始扯淡了!!! 不感興趣的同學,可以跳過了!!! 笨叔之前在大學里面, 剛接觸單片機時。就被 windows 平臺 例如 keill 5 、IAR 等一堆開會環境差點勸退。 當時也是堅持咬牙一點點摸索過來的。剛摸索明白,覺得單片…

Spring-loC與DI

目錄 1 loC控制反轉思想 2 DI依賴注入 3 loC詳解 3.1 存儲Bean (1)Controller (2)Service (3)Repository (4)Component (5)Configuration &#xf…

職業本科單片機與嵌入式技術實訓室建設設想

一、引言 在當今數字化與智能化飛速發展的時代,單片機與嵌入式技術作為信息技術領域的關鍵支撐,廣泛應用于工業控制、智能家居、物聯網、汽車電子等眾多行業,成為推動產業升級和創新發展的核心驅動力。職業本科教育旨在培養適應生產、建設、…

傳統消防演練與 VR 消防演練的區別有哪些

演練形式:傳統消防演練往往依托真實的場地,像空曠的廣場、廢棄的建筑物或是專門的消防訓練基地等。參與者能觸摸并使用實實在在的消防設備,例如干粉滅火器、二氧化碳滅火器、消防水帶等。在演練時,會通過點燃模擬火源、釋放煙霧等…

【零基礎學AI】 第6講:數據可視化基礎

本節課你將學到 理解數據可視化在AI中的重要作用 掌握Matplotlib的基本架構和核心概念 學會創建各種類型的圖表(線圖、柱狀圖、散點圖、餅圖等) 掌握圖表美化和自定義技巧 完成銷售趨勢圖表制作實戰項目 開始之前 什么是數據可視化? 數據可…

基于SSM+JSP 的旅游管理系統

【旅游景點管理系統】【送文檔】|SSM | JSP 【運行開發環境】 jdk1.8 idea mysql maven tomcat 【技術棧】 Spring SpringMVC mybatis JSP 【項目功能】 兩個角色;管理員功能有游客管理、輪播圖管理、景點管理、景點類型管理;普…

系統 | 電腦重置 圖文教程

背景: 換內存條,換完,聲卡網卡崩盤,分析原因可能是未斷電操作(什么光感自動斷電 還是手動的香),網卡由于代理沒關,關完即可。聲卡一直沒好,電腦店說是硬件問題;自行排查了…

MyBatis深度面試指南

一、MyBatis核心解析:半ORM框架的底層真相 1. 本質與工作流 半ORM定義: 對象映射:通過ResultMap將ResultSet自動轉為Java對象(省去JDBC手動映射)。SQL控制:開發者需手動編寫SQL,框架不自動生成(與Hibernate核心區別)。工作流四步: 解析mybatis-config.xml → 構建Sq…

使用Docker部署mysql8

1、拉取mysql8的鏡像: 1 [rooti-zgn6som8 ~]# docker pull mysql:8.0 2、創建配置和數據文件夾并修改權限: 1 2 3 4 mkdir -p /data/mysql8/conf mkdir -p /data/mysql8/data chmod -R 755 /data/mysql8/ 3、配置一個自定義的配置文件my.cnf: 1 …

Vue3—插槽solt

默認插槽 父組件 <Sidebar><div>{{ strData }}</div></Sidebar> let strData ref(我是你爸爸真偉大&#xff0c;養你這么大);//定義插槽數據子組件 <slot>沒有數據&#xff0c;我先默認顯示一下 loading。。。。。。。</slot>父組件提供…

時間同步 gptp ptp

目錄 車載以太網PTP報文分析**PTP協議基礎****PTP報文類型與功能****PTP報文格式解析****時鐘同步原理與計算****車載以太網PTP分析工具****典型分析場景****車載場景特殊考慮**gPTP與PTP的對比解析**1. 基本概念****2. 核心差異對比****3. 技術細節對比****報文結構****主時鐘…

AWS WebRTC:通過shell實現多進程啟動viewer

? 前面總結了aws webrtc sdk-c項目中多進程啟動master的shell腳本,具體參考:https://blog.csdn.net/zhang_jiamin/article/details/148616899 這次總結一下多進程啟動viewer的shell腳本,以及過程中遇到的問題和解決方法。 實現說明: 1、獲取 sid 和 uid(用于認證) 2、…