Java類加載與JVM詳解:從基礎到雙親委托機制

????????在Java開發中,理解JVM(Java虛擬機)和類加載機制是掌握高級特性的關鍵。本文將從JDK、JRE、JVM的關系入手,深入講解JVM的內存結構,并詳細剖析類加載的全過程,包括加載時機、流程以及核心機制——雙親委托模型


一、JDK、JRE、JVM的關系

1.1 三者的核心區別

  • JDK(Java Development Kit):Java開發工具包,包含編譯器(javac)、調試器(jdb)等開發工具,是開發Java程序的必備環境。
  • JRE(Java Runtime Environment):Java運行時環境,包含JVM和Java類庫,用于運行Java程序。
  • JVM(Java Virtual Machine):Java虛擬機,是JRE的核心組件,負責執行字節碼(.class文件),并提供內存管理、垃圾回收等功能。

關系圖


1.2 Java程序跨平臺原理


二、JVM內存結構詳解

????????JVM(Java Virtual Machine) 是Java平臺的核心組件,它提供了跨平臺的 能力,使得Java程序可以在不同的操作系統上運行。JDK中的JVM負責解釋和執 行Java字節碼文件,同時還提供了內存管理、垃圾回收等功能,使得Java程序能 夠高效、安全地運行。

JVM的內存結構是Java程序運行的基石,主要分為以下幾部分:

類加載器(Class Loader):類加載器負責加載Java字節碼文件(.class文件), 并將其轉換為可執行的代碼。它將類加載到JVM的運行時數據區域中,并解析類 的依賴關系

運行時數據區(Runtime Data Area):運行時數據區域是JVM用于存儲程序運行 時數據的區域。它包括以下幾個部分:

2.1 核心區域劃分

區域作用特點
方法區(Method Area)存儲類的元數據(如類結構、常量池、靜態變量)線程共享,可能存在性能瓶頸(如頻繁GC)
堆(Heap)存放對象實例和數組最大的內存區域,垃圾回收的主要場所
棧(Stack)存儲局部變量、方法調用棧幀線程私有,生命周期與線程一致
本地方法棧(Native Method Stack)支持本地方法(如C/C++代碼)調用與JVM棧類似,但服務對象不同
程序計數器(Program Counter)記錄當前線程執行的字節碼指令地址線程私有,唯一不會拋出OOM異常的區域

2.2 執行引擎與垃圾回收

  • 執行引擎::執行引擎負責執行編譯后的字節碼指令,將其 轉換為機器碼并執行。它包括解釋器即時編譯器(Just-In-Time Compiler, JIT)兩個部分,用于提高程序的執行效率。
  • 垃圾回收器(GC)::垃圾回收器負責自動回收不再使用的對象和 釋放內存空間。它通過標記-清除、復制、標記-整理等算法來進行垃圾回收
  • 本地方法接口(Native Method Interface):本地方法接口允許Java程序調用本 地方法,即使用其他語言編寫的代碼。

三、類加載機制詳解

類加載是Java動態性的核心,JVM通過類加載器將.class文件加載到內存,并完成初始化。

JVM架構及執行流程如下:

解釋執行:

????????class文件內容,需要交給JVM進行解釋執行,簡單理解就是JVM解釋一行就 執行一行代碼。所以如果Java代碼全是這樣的運行方式的話,效率會稍低一 些。

JIT(Just In Time)即時編譯:

????????執行代碼的另一種方式,JVM可以把Java中的 熱點代碼直接編譯成計算機可 以運行的二進制指令,這樣后續再調用這個熱點代碼的時候,就可以直接運 行編譯好的指令,大大提高運行效率。

3.1 類加載器

類加載器可以將編譯得到的 .class文件 (存儲在磁盤上的物理文件)加載在 到內存中。

3.2 加載時機

當第一次使用到某個類時,該類的class文件會被加載到內存方法區。

3.3 加載過程

類加載的過程:加載、驗證、準備、解析、初始化

具體加載步驟:

注意事項:

????????類加載過程是按需進行的,即在首次使用類時才會觸發類的加載和初始化。此 外,類加載過程是由Java虛擬機的類加載器負責完成的,不同的類加載器可能有 不同的加載策略和行為。

類加載小節:

????????JVM的類加載過程包括加載、驗證、準備、解析和初始化等階段,它們共同完 成將Java類加載到內存中,并為類的靜態變量分配內存、解析符號引用、執行靜 態代碼塊等操作,最終使得類可以被正確地使用和執行。

3.4 加載器分類

JDK8類加載器可以分為以下四類:

3.5?雙親委托機制(Parent Delegation Model)

????????雙親委托機制是Java類加載器的一種工作機制,通過層級加載和委托父類加載器 來加載類,確保類的唯一性、安全性和模塊化。在學習這個知識點之前,大家看 下面題目。

1)問題引入

????????用戶自定義類java.lang.String,在測試類main方法中使用該類,思考: 類加載器到底加載是哪個類,是JDK提供的String,還是用戶自定義的String?

自定義String類:
package java.lang;import java.util.Arrays;public class String {private char[] arr;public String() {System.out.println("in String() ...");arr = new char[10];}public String(char[] array) {System.out.println("in String(char[]) ...");int len = array.length;arr = new char[len];System.arraycopy(array, 0, arr, 0, len);}@Overridepublic String toString() {return "MyString: " + Arrays.toString(arr);}
}

測試類:

import java.lang.String;public class Test035_String {public static void main(String[] args) {String s1 = new String();System.out.println("s1: " + s1);}}

從運行效果可知:最終加載的類是JDK提供的java.lang.String

為什么?答案是雙親委托機制

2)雙親委托機制

????????如果一個類加載器收到類加載請求,它并不會自己先去加載,而是把這個請求 委托給父類的加載器去執行,如果父類加載器還存在其父類加載器,則進一步向 上委托,最終加載請求會到達頂層的啟動類加載器 Bootstrap ClassLoader 。

????????如果頂層類加載器可以完成加載任務,則進行class文件類加載,加載成功后返 回。如果當前類加載器無法加載,則向下委托給子類加載器,此時子類加載器才 會嘗試加載,成功則返回,失敗則繼續往下委托,如果所有的加載器都無法加載 該類,則會拋出ClassNotFoundException,這就是雙親委托機制。

3.6 常用方法

案例展示:

????????準備一個jdbc的配置文件 jdbc.properties ,借助類加載器中方法解析,遍 歷輸出其配置內容。

配置文件 jdbc.properties :

 driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/db01username=rootpassword=briup

測試類:

 import java.io.IOException;import java.io.InputStream;import java.util.Map.Entry;import java.util.Properties;import java.util.Set;// static ClassLoader getSystemClassLoader()    
獲取系統類加載器
// InputStream getResourceAsStream(String name) 加載當前類class
文件相同目錄下資源文件
public class Test036_LoadFile {public static void main(String[] args) throws IOException 
{//1.獲取系統類加載器ClassLoader systemClassLoader = 
ClassLoader.getSystemClassLoader();//2.利用加載器去加載一個指定的文件// 參數:文件的路徑(注意,該路徑為相對路徑,相對于當前類
class文件存在的目錄)// 返回值:字節流InputStream is = 
systemClassLoader.getResourceAsStream("jdbc.properties");System.out.println("is: " + is);//3.實例化Properties對象,解析配置文件內容并輸出Properties prop = new Properties();prop.load(is);//配置文件內容遍歷Set<Entry<Object, Object>> entrySet = prop.entrySet();for (Entry<Object, Object> entry : entrySet) {String key = (String) entry.getKey();String value = (String) entry.getValue();System.out.println(key + ": " + value);}//4.關閉流is.close();}}

運行效果:

注意事項:getResourceAsStream(String path),參數path是相對路徑,相對當前 測試類class文件所在的目錄!


總結

????????本文從JDK/JRE/JVM的關系入手,深入解析了JVM的內存結構和類加載機制,重點講解了雙親委托模型的設計原理和作用。理解這些內容有助于優化程序性能、排查類加載沖突問題,并為后續學習反射、動態代理等高級特性打下基礎。

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

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

相關文章

準備機試--圖【y總版】[重要]【最短路】

常用代碼模板3——搜索與圖論 - AcWing 一般&#xff0c;稀疏圖&#xff08;m約等于n&#xff09;:堆優化版本的dj&#xff1b;稠密圖&#xff08;mn^2&#xff09;&#xff1a;樸素dj 最短路的難點在于建圖【抽象出點和邊】 樸素dj

Python API接口實戰指南:從入門到精通

&#x1f31f; Hello&#xff0c;我是蔣星熠Jaxonic&#xff01; &#x1f308; 在浩瀚無垠的技術宇宙中&#xff0c;我是一名執著的星際旅人&#xff0c;用代碼繪制探索的軌跡。 &#x1f680; 每一個算法都是我點燃的推進器&#xff0c;每一行代碼都是我航行的星圖。 &#x…

Spring和mybatis整合后事務攔截器TransactionInterceptor開啟提交事務流程

目錄一、說明二、TransactionInterceptor開啟事務&#xff08;1&#xff09;、攔截方法&#xff08;2&#xff09;、開啟事務綁定數據庫連接&#xff08;3&#xff09;、mybatis中sql執行數據庫連接獲取&#xff08;4&#xff09;、事務提交和當前線程ThreadLocal清理&#xff…

05.《ARP協議基礎知識探秘》

ARP協議基本介紹與實踐 文章目錄**ARP協議基本介紹與實踐**ARP概述ARP報文類型ARP工作過程解析ARP工作原理示意圖無故ARP/免費ARP實驗案例**實驗目標**實驗環境實驗步驟ARP概述 作用&#xff1a;ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析協議&#xff…

互聯網大廠面試:大模型應用開發崗位核心技術點解析

互聯網大廠面試&#xff1a;大模型應用開發崗位核心技術點解析 第一輪&#xff1a;大模型基礎與上下文工程 問題 1&#xff1a;你能簡單介紹 Transformer 架構的工作原理嗎&#xff1f; 小C&#xff1a;嗯&#xff0c;我理解是 Transformer 主要依賴自注意力機制&#xff08;Se…

【深度學習新浪潮】有沒有什么方法可以將照片變成線描稿,比如日式漫畫的那種?

一、技術原理與研究進展 1. 線描生成的核心技術路徑 傳統方法:基于邊緣檢測(如Canny算子)和形態學操作,但難以處理復雜紋理和藝術風格。 深度學習方法: 端到端生成:使用U-Net架構(如ArtLine項目)直接學習照片到線描的映射,結合自注意力機制和感知損失提升細節保留能力…

NV032NV037美光固態閃存NV043NV045

NV032NV037美光固態閃存NV043NV045在數字化浪潮席卷全球的當下&#xff0c;存儲技術的每一次突破都深刻影響著從個人消費到企業級應用的各個領域。美光科技作為行業領軍者&#xff0c;其NV系列固態閃存產品始終以技術創新為核心驅動力。本文將聚焦NV032、NV037、NV043、NV045四…

天碩G40工業固態硬盤破解軌道存儲難題

在高鐵與軌道交通高速發展的今天&#xff0c;軌道檢測探傷是保障列車安全運行的核心環節。據統計&#xff0c;我國鐵路總里程已突破16萬公里&#xff0c;日均檢測數據量超10TB。加固平板一體機作為軌道探傷領域的“移動工作站”&#xff0c;需要在跨越大江南北的極端環境中實時…

基于Velero + 阿里云 OSS的Kubernetes 集群的備份與恢復

在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;備份和恢復是保障數據安全與業務連續性的關鍵環節&#xff0c;主要方式包括 ETCD 備份恢復 和 Velero 備份恢復&#xff0c;兩者在備份粒度、恢復影響范圍、存儲位置等方面存在以下差異&#xff1a; 1、ETCD 備份恢復&…

解構與重構:“真人不露相,露相非真人” 的存在論新解 —— 論 “真在” 的行為表達本質

解構與重構&#xff1a;“真人不露相&#xff0c;露相非真人” 的存在論新解 —— 論 “真在” 的行為表達本質緒論&#xff1a;傳統解釋的突圍 —— 從 “藏才” 到 “存真”“真人不露相&#xff0c;露相非真人” 這句諺語&#xff0c;自明代《西游記》以降&#xff0c;便長期…

數據結構:哈希表、排序和查找

一、哈希算法1.將數據通過哈希算法映射成一個健值&#xff0c;存取都在同一個位置&#xff0c;實現數據的高效存儲和查找&#xff0c;時間復雜度由O(n)->O(1)2.哈希碰撞&#xff1a;多個數據通過哈希算法得到的鍵值相同二、哈希表1.構建哈希表存放0-100之間的數據2.哈希算法…

【Java基礎】Java I/O模型解析:BIO、NIO、AIO的區別與聯系(Netty入門必備基礎)

Java I/O模型深度解析&#xff1a;BIO、NIO、AIO的區別與聯系 引言 在Java的網絡編程與文件操作中&#xff0c;I/O&#xff08;輸入/輸出&#xff09;模型是繞不開的核心話題。從早期的BIO&#xff08;Blocking I/O&#xff09;到Java 1.4引入的NIO&#xff08;Non-blocking I/…

windows PowerToys之無界鼠標:一套鍵鼠控制多臺設備

&#x1f4bb;簡介 在多設備協作的工作場景中&#xff0c;如何實現一套鍵鼠控制多臺設備了&#xff1f;微軟推出的 PowerToys 工具集中的 Mouse Without Borders&#xff08;無界鼠標&#xff09;&#xff0c;通過軟件層實現跨設備的鍵鼠共享與數據同步功能&#xff0c;為多臺…

一道比較難的sql題,篩選出重復字段的行數

select * from 導入數據表; id city_column 1 北京,上海,廣州 2 上海,上海,深圳 3 北京,杭州,北京 4 上海,廣州,深圳select substring_index(khmc,,,1), * from 導入數據表 truncate table 導入數據表 select count(distinct khmc) from 導入數據表; …

【K8s】整體認識K8s之與集群外部訪問--service

這一篇文章主要是對service發現新的理解 為什么要使用service服務發現&#xff1f; 首先pod的IP&#xff0c;是動態的&#xff0c;當我們重啟一個pod的時候&#xff0c;它會給它分配一個新的IP&#xff0c;但是如果微服務a想要去調用微服務b&#xff0c;他是需要知道微服務b所有…

k8s(自寫)

kubernetes k8s是什么&#xff1f;Kubernetes是什么&#xff1f;架構是怎么樣的&#xff1f;6分鐘快速入門_嗶哩嗶哩_bilibili kubernetes是google開源神器&#xff0c;介于應用服務和服務器之間&#xff0c;能夠通過策略協調和管理多個應用服務&#xff0c;只需要一個yaml文…

實現微信小程序的UniApp相機組件:拍照、錄像與雙指縮放

在微信小程序開發中&#xff0c;相機功能已成為許多應用的核心組成部分。本文將介紹如何使用UniApp框架實現一個功能豐富的相機組件&#xff0c;支持拍照、錄像、前后攝像頭切換以及雙指縮放等功能。功能概述這個相機組件具備以下核心功能&#xff1a;拍照功能&#xff1a;支持…

python pyqt5開發DoIP上位機【診斷回復的函數都是怎么調用的?】

目錄 文章合集 一、底層網絡接收:`_receive_loop`(觸發起點) 調用時機: 核心代碼: 作用: 二、數據解析:`handle_received_data`(判斷是否為診斷回復) 調用時機: 核心代碼(診斷回復相關部分): 作用: 三、UI顯示:`add_trace_entry`(展示到界面) 調用時機: 信號…

談物質的運動與運動的物質

運動的物質是不是物質的運動&#xff0c;如果假設是&#xff08;第一假設&#xff09;&#xff0c;那末運動的物質是物質的運動&#xff0c;而運動是物質的根本屬性&#xff0c;又運動的物質是物質&#xff0c;則物質的運動是物質&#xff0c;既然運動是物質的根本屬性&#xf…

【MLLM】多模態理解Ovis2.5模型架構和訓練流程

note 模型架構&#xff1a;延續 Ovis 系列創新的結構化嵌入對齊設計。 Ovis2.5 由三大組件構成&#xff1a;動態分辨率 ViT 高效提取視覺特征&#xff0c;Ovis 視覺詞表模塊實現視覺與文本嵌入的結構對齊&#xff0c;最后由強大的 Qwen3 作為語言基座&#xff0c;處理多模態嵌…