類初始化,類加載,類加載器

類初始化,類加載,類加載器

  • 1. 類加載
    • 1.1. 類的加載
    • 1.2. 類的鏈接
      • 1.2.1. 驗證
      • 1.2.2. 準備
      • 1.2.3. 解析
  • 2. 類加載器
    • 2.1. 類加載器分為四種:前三種為虛擬機自帶的加載器。
    • 2.2. 類加載有三種方式:
    • 2.3. **JVM類加載機制**
    • 2.4. 雙親委派機制
  • 3. 類的初始化
    • 3.1. 類的主動引用會發生類的初始化
    • 3.2. 類的被動引用不會發生類的初始化
    • 3.3. 類緩存

在這里插入圖片描述

1. 類加載

1.1. 類的加載

類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個 java.lang.Class對象,用來封裝類在方法區內的數據結構。

  • 類的加載的最終產品是位于堆區中的 Class對象, Class對象封裝了類在方法區內的數據結構,并且向Java程序員提供了訪問方法區內的數據結構的接口。

  • 在加載階段,虛擬機需要完成以下三件事情:

    • 通過一個類的全限定名來獲取其定義的二進制字節流。
    • 將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
    • 在Java堆中生成一個代表這個類的 java.lang.Class對象,作為對方法區中這些數據的訪問入口。
  • 加載.class文件的方式

    • 從本地系統中直接加載
    • 通過網絡下載.class文件
    • 從zip,jar等歸檔文件中加載.class文件
    • 從專有數據庫中提取.class文件
    • 將Java源文件動態編譯為.class文件

1.2. 類的鏈接

  • 將java類的二進制代碼合并到JVM的運行狀態中的過程

1.2.1. 驗證

  • 驗證:確保加載的類信息符合JVM規范,沒有安全方面的問題
  • 驗證階段大致會完成4個階段的檢驗動作:
    • 文件格式驗證:驗證字節流是否符合Class文件格式的規范;例如:是否以 0xCAFEBABE開頭、主次版本號是否在當前虛擬機的處理范圍之內、常量池中的常量是否有不被支持的類型。
    • 元數據驗證:對字節碼描述的信息進行語義分析(注意:對比javac編譯階段的語義分析),以保證其描述的信息符合Java語言規范的要求;例如:這個類是否有父類,除了 java.lang.Object之外。
    • 字節碼驗證:通過數據流和控制流分析,確定程序語義是合法的、符合邏輯的。
    • 符號引用驗證:確保解析動作能正確執行。

1.2.2. 準備

  • 準備:正式為類變量(static)分配內存并設置類變量默認初始值的階段,這些內存都將在方法區中進行分配

該階段有以下幾點需要注意:

  • 1、這時候進行內存分配的僅包括類變量(static),而不包括實例變量,實例變量會在對象實例化時隨著對象一塊分配在Java堆中。
  • 2、這里所設置的初始值通常情況下是數據類型默認的零值(如0、0L、null、false等),而不是被在Java代碼中被顯式地賦予的值。
  • 3、如果類字段的字段屬性表中存在 ConstantValue屬性,即同時被final和static修飾,那么在準備階段變量value就會被初始化為ConstValue屬性所指定的值。

假設一個類變量的定義為: public static int value=3;那么變量value在準備階段過后的初始值為0,而不是3,因為這時候尚未開始執行任何Java方法,而把value賦值為3的 public static指令是在程序編譯后,存放于類構造器 <clinit>()方法之中的,所以把value賦值為3的動作將在初始化階段才會執行

  • 對基本數據類型來說,對于類變量(static)和全局變量,如果不顯式地對其賦值而直接使用,則系統會為其賦予默認的零值,而對于局部變量來說,在使用前必須顯式地為其賦值,否則編譯時不通過。
  • 對于同時被static和final修飾的常量,必須在聲明的時候就為其顯式地賦值,否則編譯時不通過;而只被final修飾的常量則既可以在聲明時顯式地為其賦值,也可以在類初始化時顯式地為其賦值,總之,在使用前必須為其顯式地賦值,系統不會為其賦予默認零值。
  • 對于引用數據類型reference來說,如數組引用、對象引用等,如果沒有對其進行顯式地賦值而直接使用,系統都會為其賦予默認的零值,即null。
  • 如果在數組初始化時沒有對數組中的各元素賦值,那么其中的元素將根據對應的數據類型而被賦予默認的零值。

1.2.3. 解析

  • 解析:虛擬機常量池內的符號引用(常量名)替換為直接引用(地址)的過程
  • 解析動作主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用點限定符7類符號引用進行。符號引用就是一組符號來描述目標,可以是任何字面量。直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。

2. 類加載器

2.1. 類加載器分為四種:前三種為虛擬機自帶的加載器。

  • 啟動類加載器(Bootstrap)C++
    • 負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現,不是ClassLoader子類
  • 擴展類加載器(Extension)Java
    • 負責加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/ext/ *.jar或-Djava.ext.dirs指定目錄下的jar包的一些jar包
  • 應用程序類加載器(AppClassLoader)Java
    • 也叫系統類加載器,負責加載classpath中指定的jar包及目錄中class
  • 用戶自定義加載器 Java.lang.ClassLoader的子類,用戶可以定制類的加載方式

2.2. 類加載有三種方式:

  • 1、命令行啟動應用時候由JVM初始化加載
  • 2、通過Class.forName()方法動態加載
  • 3、通過ClassLoader.loadClass()方法動態加載

2.3. JVM類加載機制

  • 全盤負責,當一個類加載器負責加載某個Class時,該Class所依賴的和引用的其他Class也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入
  • 父類委托,先讓父類加載器試圖加載該類,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類
  • 緩存機制,緩存機制將會保證所有加載過的Class都會被緩存,當程序中需要使用某個Class時,類加載器先從緩存區尋找該Class,只有緩存區不存在,系統才會讀取該類對應的二進制數據,并將其轉換成Class對象,存入緩存區。這就是為什么修改了Class后,必須重啟JVM,程序的修改才會生效

2.4. 雙親委派機制

  • 雙親委派機制:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把請求委托給父加載器去完成,依次向上。
    • 1、當AppClassLoader加載一個class時,它首先不會自己去嘗試加載這個類,而是把類加載請求委派給父類加載器ExtClassLoader去完成。
    • 2、當ExtClassLoader加載一個class時,它首先也不會自己去嘗試加載這個類,而是把類加載請求委派給BootStrapClassLoader去完成。
    • 3、如果BootStrapClassLoader加載失敗(例如在$JAVA_HOME/jre/lib里未查找到該class),會使用ExtClassLoader來嘗試加載;
    • 4、若ExtClassLoader也加載失敗,則會使用AppClassLoader來加載
    • 5、如果AppClassLoader也加載失敗,則會報出異常ClassNotFoundException
  • 好處:
    • 防止內存中出現多份同樣的字節碼(安全性角度)

      • 比如加載位于 rt.jar 包中的類 java.lang.Object,不管是哪個加載器加載這個類,最終都是委托給頂層的啟動類加載器進行加載,這樣就保證了使用不同的類加載器最終得到的都是同樣一個 Object對象。
    • 保證Java程序安全穩定運行

3. 類的初始化

在Java中對類變量進行初始值設定有兩種方式:①聲明類變量時指定初始值;②使用靜態代碼塊為類變量指定初始值。

  • 特點
    • 執行類構造器<clinit>()方法的過程。
      • 類構造器<clinit>()方法是由編譯器自動收集類中所有類變量的賦值動作和靜態代碼塊中的語句合并產生的。(類構造器是構造類信息的,不是構造該類對象的構造器)
    • 當初始化一個類時,如果其父類還沒有進行初始化,則先觸發其父類的初始化
    • 虛擬機會保證一個類的<clinit>()方法在多線程環境中被正確加鎖和同步

3.1. 類的主動引用會發生類的初始化

  • 當虛擬機啟動,會先初始化main方法所在的類
  • new一個類的對象
  • 調用類的靜態成員(除了final常量)和靜態方法
  • 使用Java.lang.reflect包的方法對類進行反射調用
  • 初始化一個類時,其父類如果沒有初始化,則會先初始化它的父類

3.2. 類的被動引用不會發生類的初始化

  • 訪問一個靜態域時,只有真正聲明這個域的類才會被初始化。如:通過子類引用父類的靜態變量,不會導致子類初始化
  • 通過數組定義類引用,不會觸發此類的初始化
  • 引用常量不會觸發此類的初始化(常量在鏈接階段就存入調用類的常量池中了)

3.3. 類緩存

標準的javaSE類加載器可以按要求查找類,一旦某個類 被加載到類加載器中,它將維持加載(緩存)一段時間。但是JVM垃圾回收機制可以回收這些Class對象

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

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

相關文章

GeoTrust通配符證書:保護您的網站安全

GeoTrust通配符 SSL證書是一種特殊的 SSL 證書類型&#xff0c;它可以同時為您的主域名及其所有子域提供安全保護。無論您有多少個不同的子域需要保障&#xff0c;都可以通過單一的 GeoTrust 通配符 SSL 證書輕松實現&#xff0c;極大地簡化了管理流程并降低了成本。 此外&…

1688商品詳情數據接口(1688.item_get)

1688商品詳情數據接口是一種程序化的接口&#xff0c;通過這個接口&#xff0c;商家或開發者可以使用自己的編程技能&#xff0c;對1688平臺上的商品信息進行查詢、獲取和更新。這個接口允許商家根據自身的需求&#xff0c;獲取商品的詳細信息&#xff0c;例如價格、庫存、描述…

JUC(Java Util Concurrent)多線程并發庫

JUC&#xff08;Java Util Concurrent&#xff09;是Java中用于編寫多線程并發程序的庫。開發過程中使用JUC主要有以下幾個好處&#xff1a; 1. 提高程序性能&#xff1a;使用JUC可以實現多線程并發執行&#xff0c;充分利用多核CPU&#xff0c;提高程序的性能。 2. 簡化代碼…

群暉NAS搭建WebDav服務做文件共享,可隨時隨地遠程訪問

文章目錄 1. 在群暉套件中心安裝WebDav Server套件1.1 安裝完成后&#xff0c;啟動webdav服務&#xff0c;并勾選HTTP復選框 2. 局域網測試WebDav服務2.1 下載RaiDrive客戶端2.2 打開RaiDrive&#xff0c;設置界面語言可以選擇中文2.3 點擊添加按鈕&#xff0c;新建虛擬驅動區2…

從事軟件測試8年,對業務測試人員的一些思考

自從事測試工作八年多以來&#xff0c;經歷過三個部門多條業務線&#xff0c;也經歷過測試轉型再回到測試&#xff0c;在此過程中對測試工作和角色的認知也逐步有些思考&#xff0c;想把這些思考分享給大家&#xff0c;希望為業務測試同學提供一些有價值的思路。 同時&#xff…

YOLOV7主干改進,使用fasternet輕量化改進主干(完整教程)

1&#xff0c;Pconv&#xff08;來自Fasternet&#xff09;&#xff08;可作為模型中的基礎卷積模塊使用&#xff09; 論文鏈接&#xff1a;https://arxiv.org/abs/2303.03667 2&#xff0c;為了大家方便的使用&#xff0c;這里我對原本的PConv的代碼做了部分的改動&#xff0…

立哥尖端技術-云安全整合方案

云安全管理中心 安全管理中心具有集中管控云環境整體安全態勢的功能&#xff0c;具備以下功能&#xff1a; &#xff08;1&#xff09;部署方式&#xff1a;與云平臺緊耦合&#xff0c;可實現云平臺一鍵下單&#xff0c;自動交付。 &#xff08;2&#xff09;安全態勢總覽&a…

拿下掙值管理,軟考集成你就成功了一半!

在備考軟考集成的時候&#xff0c;掙值管理有多重要呢&#xff1f;掙值管理的計算題考的頻率非常高&#xff0c;基本上每年都會考。 而且&#xff0c;計算題基本上都是20分左右&#xff0c;只要能在這道計算題上得滿分&#xff0c;那么45分及格的考試就已經成功了一半。 今天…

豪華程度堪比飛機頭等艙?奔馳在北美發布Tourrider系列巴士

今年三月&#xff0c;奔馳工廠附近出現了一臺特殊的測試車。其突出的前保險杠以及豎置雙風擋等特殊配置&#xff0c;都在暗示著它并非是為歐洲市場打造。 根據特征推測&#xff0c;這臺車應該是為北美市場打造。 就在昨天&#xff0c;奔馳發布了旗下全新Tourrider系列豪華客車&…

python數據分析高效代碼合集

文章目錄 問題:我有5個dataframe,都包含time 列,如何將它們根據time列取交集,并保存到同一個excel的不同sheet頁中。**df1,df2, df3, df4, df5,其也要用取交集后的time列**問題:我有5個dataframe,都包含time 列,如何將它們根據time列取交集,并保存到同一個excel的不同…

npm安裝 node-sass

第一步&#xff1a;安裝node-gyp 1.: npm install node-gyp -g2.: node-gyp install3.: npm install node-sass

QML24、常規組件StackView

1.簡介與示例 StackView管理著view頁面的生命周期,提供了頁面的棧式導航。這些view頁面可能有業務需要,根據業務需要,可以一級一級向深處跳轉,根據當前view的狀態與設定的情況,可能產生一個新view或者返回之前view 比如:注冊賬號分步驟,輸入用戶名,密碼,點擊下…

嵌入式單片機方向和Linux驅動開發方向哪個發展前景好?

嵌入式單片機方向和Linux驅動開發方向哪個發展前景好&#xff1f; 在某些平臺上看到很多人鼓吹嵌入式Linux開發比單片機開發要好&#xff0c;讓所有人都去做嵌入式Linux開發。說這種話的人大多數是嵌入式Linux的培訓機構&#xff0c;或者是一開始就以嵌入式Linux入門的那一批人…

小型養豬場污水處理技術方案

諸城市鑫淼環保小編帶大家了解一下小型養豬場污水處理技術方案 1.初步處理&#xff1a; 豬舍設立固液分離裝置&#xff1a;這可以幫助將固體糞便與液體污水分開&#xff0c;減少進一步處理的難度和成本。 設置沉淀池&#xff1a;讓分離后的污水在沉淀池內停留&#xff0c;使部分…

Windows更換主板后一直提示,你的pin碼不可再用解決辦法

最近惠普電腦主板壞了&#xff0c;到售后去維修電腦更換了個主板。 在經過了一系列的重新開機后&#xff0c;就直接卡在了“你的pin碼不可再用”那里。 主要癥狀就是&#xff0c;一直點一直連不上windows的 microsoft賬戶&#xff0c;點完一會兒黑屏。然后就回到了一開頭的“你…

飛書如何接入ChatGPT-打造個人智能問答助手實現無障礙交流

目錄 前言 環境列表 1.飛書設置 2.克隆feishu-chatgpt項目 3.配置config.yaml文件 4.運行feishu-chatgpt項目 5.安裝cpolar內網穿透 6.固定公網地址 7.機器人權限配置 8.創建版本 9.創建測試企業 10. 機器人測試 總結 前言 在飛書中創建chatGPT機器人并且對話&am…

python連接數據庫的方式

python連接數據庫的方式 pyzenith.connect&#xff08;&#xff09;函數就是連接數據庫&#xff1b; exception.ScriptException&#xff08;&#xff09;這一句是自定義異常&#xff0c;可以不用我這個&#xff1b; finally里面還有一個try finally是有必要的&#xff0c;防止…

抖音汽車租賃小程序技術指南:開發高效便捷的租賃系統

為了更好地滿足用戶需求&#xff0c;抖音汽車租賃小程序成為一個備受關注的技術解決方案。本文將深入探討開發高效便捷的汽車租賃系統所需的技術要點&#xff0c;為開發者提供一份實用的技術指南。 小程序架構選擇 在搭建抖音汽車租賃小程序時&#xff0c;選擇合適的小程序架構…

【Rust】從零開始的rust學習嗷

Rust Rust是什么&#xff1f;安裝rust在Linux或者Mac OS&#xff1a;在Windows&#xff1a;更新與卸載 rust起步寫我們的第一個程序&#xff0c;hello worldcargo使用cargo創建項目cargo基本命令 才來實習&#xff0c;由于部門使用的SDK是rust語言&#xff0c;所以先淺淺進行ru…

C/C++---------------LeetCode第1436. 旅行終點站

旅行的終點站 題目及要求哈希算法在main內使用 題目及要求 給你一份旅游線路圖&#xff0c;該線路圖中的旅行線路用數組 paths 表示&#xff0c;其中 paths[i] [cityAi, cityBi] 表示該線路將會從 cityAi 直接前往 cityBi 。請你找出這次旅行的終點站&#xff0c;即沒有任何可…