日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

虚拟机系列 | JVM类加载机制

發(fā)布時間:2025/3/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 虚拟机系列 | JVM类加载机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、類加載簡介

類的加載機制是指把編譯后的.class類文件的二進制數(shù)據(jù)讀取到內(nèi)存中,并為之創(chuàng)建一個java.lang.Class對象,用來封裝類在元數(shù)據(jù)空間的數(shù)據(jù)結構。

類在JVM中的生命周期為:加載,連接,初始化,使用,卸載。不過這里只重點描述加載,連接,初始化這三個過程。

二、加載過程

基于一張圖看類加載子系統(tǒng)的細節(jié)流程:

1、加載階段

過程描述

加載階段需要完成以下三個過程:

  • 通過類的全限定名來獲取其定義的二進制字節(jié)流;
  • 將字節(jié)流所代表的靜態(tài)存儲結構轉化為云數(shù)據(jù)空間的運行時數(shù)據(jù)結構;
  • 在堆Heap中生成一個代表這個類的java.lang.Class對象,作為對元數(shù)據(jù)空間中這些數(shù)據(jù)的訪問入口;

類加載器

  • 引導類加載器

Bootstrap-ClassLoader基于C/C++實現(xiàn),負責加載Java的核心類庫JAVA_HOME\jre\lib\rt.jar,該加載器不繼承自ClassLoader抽象類,并且只加載包名為java、javax、sun等開頭類,一次保證對核心源碼的保護。

  • 擴展類加載器

Extension-ClassLoader,基于Java語言,由sun.misc.Launcher$ExtClassLoader實現(xiàn),派生于ClassLoader抽象類,從java.ext.dirs系統(tǒng)變量指定的路徑中的加載類庫,或者JDK安裝目錄jre\lib\ext目錄下加載。

  • 系統(tǒng)類加載器

Application-ClassLoader,基于Java語言,由sun.misc.Launcher$ExtClassLoader實現(xiàn),它負責加載環(huán)境變量ClassPath指定的類庫,如果在應用程序中沒有自定義類加載器,一般情況下作為程序中默認的類加載器。

2、連接階段

驗證

目的在于確保Class文件的字節(jié)流中包含的信息符合當前虛擬機的要求,保證加載類的正確性,不會危害虛擬機自身的安全,主要包括四種檢驗動作:

  • 文件格式驗證:驗證字節(jié)流是否符合Class文件格式的規(guī)范;
  • 元數(shù)據(jù)驗證:確保其描述的信息符合Java語言規(guī)范的要求;
  • 字節(jié)碼驗證:確定程序語義是符合邏輯的;
  • 符號引用驗證:確保解析動作能正確執(zhí)行。

準備

為類的靜態(tài)變量分配內(nèi)存,并初始化為默認值,這時候進行內(nèi)存分配的僅包括類變量(static)修飾,不包括(final-static)修飾的,這里也不會為實例變量分配初始化,實例變量會隨著對象一塊分配到Java堆中。

解析

將常量池中的符號引用轉換為直接引用的過程,直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。解析主要針對類或接口、字段、類方法、接口方法、方法類型等,解析的動作實際是會隨著JVM在執(zhí)行完初始化之后再執(zhí)行的。

3、初始化階段

執(zhí)行類構造器()方法的過程,該方法不需要自定義,是javac編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)代碼塊中的語句合并而來,Jvm要保證()方法在多線程訪問下的安全性。

三、機制策略

1、雙親委派模式

類加載器收到了類加載的請求時,不會自己先去嘗試加載這個類,而是把請求委托給父加載器去執(zhí)行;

如果父加載器還存在父類加載器,則依次向上委托,因此類加載請求最終都應該被傳遞到頂層的啟動類加載器中;

如果父類加載器可以完成類加載請求,就直接成功返回,只有當父加載器在無法完成該加載,子加載器才會嘗試自己去加載該類;

2、沙箱安全機制

假設自定義一個類名為String且所在包為java.lang,在使用引導類加載器加載時會先加載JDK中的String類,因為這個類本來是屬于jdk的,后面再次出現(xiàn)String類就會報錯,以此保證源代碼不被惡意篡改,這就是沙箱安全機制。

四、源代碼地址

GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent

推薦閱讀:編程體系整理

序號項目名稱GitHub地址GitEE地址推薦指數(shù)
01Java描述設計模式,算法,數(shù)據(jù)結構GitHub·點這里GitEE·點這里☆☆☆☆☆
02Java基礎、并發(fā)、面向對象、Web開發(fā)GitHub·點這里GitEE·點這里☆☆☆☆
03SpringCloud微服務基礎組件案例詳解GitHub·點這里GitEE·點這里☆☆☆
04SpringCloud微服務架構實戰(zhàn)綜合案例GitHub·點這里GitEE·點這里☆☆☆☆☆
05SpringBoot框架基礎應用入門到進階GitHub·點這里GitEE·點這里☆☆☆☆
06SpringBoot框架整合開發(fā)常用中間件GitHub·點這里GitEE·點這里☆☆☆☆☆
07數(shù)據(jù)管理、分布式、架構設計基礎案例GitHub·點這里GitEE·點這里☆☆☆☆☆
08大數(shù)據(jù)系列、存儲、組件、計算等框架GitHub·點這里GitEE·點這里☆☆☆☆☆

總結

以上是生活随笔為你收集整理的虚拟机系列 | JVM类加载机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。