JVM的類加載器

什么是類加載器?

類加載器:JVM只會運行二進制文件,類加載器的作用就是將字節碼文件加載到JVM中,從而Java

程序能夠啟動起來。

類加載器有哪些?

啟動類加載器(BootStrap ClassLoader):加載JAVA HOME/jre/lib目錄下的庫

擴展類加載器(ExtClassLoader):主要加載JAVA HOME/jre/lib/ext目錄中的類

應用類加載器(AppClassLoader):用于加載classPath下的類。是默認的類加載器,一般來說,java

應用的類都是由該加載器加載的。

在java的日常應用開發中,類的加載基本上都是由這三種加載器互相配合完成加載的。

自定義類加載器(CustomizeClassLoader):自定義類繼承ClassLoader,實現自定義類加載規則。

什么是雙親委派模型?

加載某一個類,先委托上一級的加載器進行加載,如果上級加載器也有上級,則會繼續向上委托

如果該類委托上級沒有被加載,子加載器嘗試加載該類

舉例

在加載Student類時,應用類加載器會委派擴展類加載器,擴展類加載器會委派啟動類加載器,啟動類加載器不會加載,擴展類不會加載,然后應用類加載器加載Student類

JVM為什么會采用雙親委派機制?

(1)通過雙親委派機制可以避免某一個類被重復加載,當父類已經加載后則無需重復加載,保證唯

一性。

(2)為了安全,保證類庫API不會被修改

例子

類裝載的執行過程

?類從加載到虛擬機中開始,直到卸載為止,它的整個生命周期包括了:加載、驗證、準備、解析、初始化、使用和卸載這7個階段。其中,驗證、準備和解析這三個部分統稱為連接(linking)

加載階段:

  • 通過類的全名,獲取類的二進制數據流。
  • 解析類的二進制數據流為方法區內的數據結構(Java類模型)
  • 創建java.lang.Class類的實例,表示該類型。作為方法區這個類的各種數據的訪問入口

驗證階段:驗證類是否符合JVM的規范,安全性檢查

準備階段:為類變量分配內存并設置類變量的初始值

  • static變量,分配空間在準備階段完成(設置默認值),賦值在初始化階段完成
  • static變量是final的基本類型,以及字符串常量,值已確定,賦值在準備階段完成
  • static變量是final的引用類型,那么賦值也會在初始化階段完成
例子?

變量b分配空間在準備階段完成(設置默認值0),賦值在初始化階段完成 b=10

變量c 和 變量d?值已確定,賦值在準備階段完成

變量obj?賦值也會在初始化階段完成

解析階段:把類中的符號引用轉換為直接引用

符號引用和直接引用的例子

比如:方法中調用了其他方法,方法名可以理解為符號引用,而直接引用就是使用指針直接指向方法

初始化階段:對類的靜態變量,靜態代碼塊執行初始化操作

  • 如果初始化一個類的時候,其父類尚未初始化,則優先初始化其父類
  • 如果同時包含多個靜態變量和靜態代碼塊,則按照自上而下的順序依次執行。
案例:
public class Application {public static void main(String[] args) {// 1. 首次訪問這個類的靜態變量或靜態方法時System.out.println(Animal.num);// 2. 子類初始化,如果父類還沒初始化,會引發父類先初始化System.out.println(Cat.sex);// 3. 子類訪問父類靜態變量,只觸發父類初始化System.out.println(Cat.num);}
}class Animal {static int num = 55;static {System.out.println("Animal 靜態代碼塊...");}
}class Cat extends Animal {static boolean sex = false;static {System.out.println("Cat 靜態代碼塊...1");}static {System.out.println("Cat 靜態代碼塊...2");}
}

1.訪問父類的變量

執行結果

2.訪問子類的變量

3.子類訪問父類的靜態變量

使用階段:

  • JVM 開始從入口方法開始執行用戶的程序代碼
  • 調用靜態類成員信息(比如:靜態字段、靜態方法)
  • 使用new關鍵字為其創建對象實例

卸載階段:當用戶程序執行完畢之后,JVM便開始銷毀創建的Class對象

總結:

加載:查找和導入class文件

驗證:保證加載類的準確性

準備:為類變量分配內存并設置類變量初始值

解析:把類中的符號引用轉換為直接引用

初始化:對類的靜態變量,靜態代碼塊執行初始化操作

使用:JVM 開始從入口方法開始執行用戶的程序代碼

卸載:當用戶程序代碼執行完畢后,JM便開始銷毀創建的Class對象。

?

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

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

相關文章

web前端開發中vscode常用的快捷鍵

1.快速復制一行 快捷鍵: shiftalt 下箭頭(上箭頭) 或者 ctrlc 然后 ctrlv 2.選定多個相同的單詞 快捷鍵: ctrl d 先雙擊選定一個單詞,然后按下 ctrl d 可以往下依次選擇相同的單詞。 這樣同時修改相同的單詞 3.全局替換某單詞 當我們一個…

C與C++的區別,類型轉換,引用

1.從C到C 語言的區別 C語言 編譯性語言 面向過程語言靈活 移植性好 效率高shell 解釋性語言 面向過程語言Linux運維C 編譯性語言 面向對象面向對象語言效率最高的 應用領域:系統開發(APP開發,服務器開發),引擎開發,游戲開發&…

SQL-leetcode—1581. 進店卻未進行過交易的顧客

1581. 進店卻未進行過交易的顧客 表:Visits -------------------- | Column Name | Type | -------------------- | visit_id | int | | customer_id | int | -------------------- visit_id 是該表中具有唯一值的列。 該表包含有關光臨過購物中心的顧客的信息。 …

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依賴 JDK 環境 查看 Mac JDK 環境,如果沒有安裝,先安裝 打開終端輸入命令:java -version Mac安裝配置 JDK 二. 檢查 HomeBrew 安裝 檢查 HomeBrew 是否安裝,終端輸入命令:brew -v Mac安裝HomeB…

鴻蒙HarmonyOS NEXT開發:優化用戶界面性能——組件復用(@Reusable裝飾器)

文章目錄 一、概述二、原理介紹三、使用規則四、復用類型詳解1、標準型2、有限變化型2.1、類型1和類型2布局不同,業務邏輯不同2.2、類型1和類型2布局不同,但是很多業務邏輯公用 3、組合型4、全局型5、嵌套型 一、概述 組件復用是優化用戶界面性能&#…

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow構建私有知識庫

文章目錄 DeepSeek介紹公司背景核心技術產品與服務應用場景優勢與特點訪問與體驗各個DeepSeek-R系列模型的硬件需求和適用場景 Ollama主要特點優勢應用場景安裝和使用配置環境變量總結 安裝open-webui下載和安裝docker desktop配置鏡像源安裝open-webui運行和使用 RagFlow介紹主…

更加通用的Hexo多端部署原理及實現,適用于各種系統之間

本文推薦在作者的個人博客網站閱讀:shenying.online 一、故事背景 故事發生在大學上學期間(而不是寒假)。上學期間,宿舍條件極其惡劣,半夜斷電、空間狹小。我們大學垃圾條件使用游戲本的種種弊端被無限放大&#xff1…

開源、免費項目管理工具比較:2025最新整理30款

好用的開源、免費版項目管理系統有:1.Redmine;2. Taiga;3. OpenProject; 4.ProjectLibre; 5.GanttProject; 6.Tuleap; 7.Trac;8. Phabricator; 9.Notion; 10.…

組織結構改革:激活企業活力的 “源頭活水”

難以適應市場變化、內部溝通與協作不暢、決策效率低下、運營成本增加、人才流失嚴重、員工士氣下降、戰略目標難以實現……企業如何根據市場環境變化和自身發展需求,靈活調整組織框架,賦能企業的持續健康發展? 某國有投資建設集團旗下的二級…

oracle中decode怎么轉換成pg

對于 PostgreSQL 中的 Oracle DECODE 函數,可以使用 CASE 表達式或聯合。CASE 表達式根據條件返回第一個匹配的結果,語法為:CASE WHEN 條件 THEN 結果 ELSE 結果 END。聯合通過 UNION ALL 操作符組合多個 SELECT 語句,返回一個包含…

Mac之JDK安裝

Mac之JDK安裝 一.安裝 jdk 打開終端輸入命令:java -version 查看是否已安裝 JDK Oracle 官方下載地址 根據自己Mac 系統安裝 查看 Mac 系統,打開中斷命令,輸入: uname -a Compressed Archive 是壓縮文檔,下載的是一個 .tar.gz 壓縮包 D…

【含文檔+PPT+源碼】基于Python的全國景區數據分析以及可視化實現

項目介紹 本課程演示的是一款基于Python的全國景區數據分析以及可視化實現,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 帶你從零開始部署運行本套系統 該…

Unity中快速制作2D沙雕動畫:流程編

Unity中快速制作2D沙雕動畫(搞笑/無厘頭風格),通過以下方案實現低成本、高成效的開發流程,結合夸張的動作、滑稽的物理效果和魔性音效: 1. 角色與素材設計 核心原則:丑萌即正義,越怪越好&#…

保存字典類型的文件用什么格式比較好

保存 Python 字典類型的數據時,有幾個常見的格式可以選擇,這些格式都具有良好的可讀性和提取內容的便利性。以下是幾種推薦的格式: JSON 格式: 優點:JSON 格式非常適合存儲和傳輸結構化數據,具有良好的跨平…

SQL注入之布爾和時間盲注,sqli-labs

實驗環境: sqli-labs,小皮面板搭建,edge瀏覽器 apache:2.4.39,MySQL:5.7 PHP:5.39 Python(pycharm2023):3 less-8 布爾盲注: 1.我這里是采用最簡單的直接采…

基于SSM的農產品供銷小程序+LW示例參考

1.項目介紹 系統角色:管理員、農戶功能模塊:用戶管理、農戶管理、產品分類管理、農產品管理、咨詢管理、訂單管理、收藏管理、購物車、充值、下單等技術選型:SSM,Vue(后端管理web),uniapp等測試…

移植BOA服務器到GEC2440開發板

所需軟件:boa-0.94.13.tar.tar(下載:http://www.boa.org/boa-0.94.13.tar.gz) 步驟: 設置好交叉編譯工具鏈。 1、解壓下載好的壓縮包(tar xzvf boa-0.94.13.tar.tar),并進入解壓后的目錄(cd boa-0.94.13),再進行如下操作: 先進入到src目錄(下面操作都是在該目錄下進行…

Go 語言里中的堆與棧

在 Go 語言里,堆和棧是內存管理的兩個重要概念,它們在多個方面存在明顯差異: 1. 內存分配與回收方式 棧 分配:Go 語言中,棧內存主要用于存儲函數的局部變量和調用信息。當一個函數被調用時,Go 會自動為其…

從360度全景照片到高質量3D場景:介紹SC-Omnigs 3D重建系統

在當今的數字化時代,3D重建技術正在迅速發展,并廣泛應用于文旅、空間智能和3D重建等領域。為了簡化360度全景相機拍攝數據的處理流程,提高3D場景重建的質量和效率,我們開發了一款專門處理360度全景相機數據的3D重建系統——SC-Omnigs。本文將詳細介紹這一系統的功能、特點及…

LayUi table 列寬 th和td不同步變化

原因 在td所在的table中,當table寬度小于頁面寬度,滾動條會消失,進而table會被加以下樣式 style"width: auto"解決 在layui.js中將以下語句 !p&&h?y.width(o.getContentWidth(l)):y.width("auto")替換成 !…