电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

jvm之java類加載機制和類加載器(ClassLoader)的用法

瀏覽:4日期:2022-08-25 09:39:38

當程序主動使用某個類時,如果該類還未被加載到內存中,則JVM會通過加載、連接、初始化3個步驟來對該類進行初始化。如果沒有意外,JVM將會連續完成3個步驟,所以有時也把這個3個步驟統稱為類加載或類初始化。

jvm之java類加載機制和類加載器(ClassLoader)的用法

一、類加載過程

1.加載

加載指的是將類的class文件讀入到內存,并為之創建一個java.lang.Class對象,也就是說,當程序中使用任何類時,系統都會為之建立一個java.lang.Class對象。

類的加載由類加載器完成,類加載器通常由JVM提供,這些類加載器也是前面所有程序運行的基礎,JVM提供的這些類加載器通常被稱為系統類加載器。除此之外,開發者可以通過繼承ClassLoader基類來創建自己的類加載器。

通過使用不同的類加載器,可以從不同來源加載類的二進制數據,通常有如下幾種來源。

從本地文件系統加載class文件,這是前面絕大部分示例程序的類加載方式。

從JAR包加載class文件,這種方式也是很常見的,前面介紹JDBC編程時用到的數據庫驅動類就放在JAR文件中,JVM可以從JAR文件中直接加載該class文件。

通過網絡加載class文件。

把一個Java源文件動態編譯,并執行加載。

類加載器通常無須等到“首次使用”該類時才加載該類,Java虛擬機規范允許系統預先加載某些類。

2.鏈接

當類被加載之后,系統為之生成一個對應的Class對象,接著將會進入連接階段,連接階段負責把類的二進制數據合并到JRE中。類連接又可分為如下3個階段。

1)驗證:驗證階段用于檢驗被加載的類是否有正確的內部結構,并和其他類協調一致。Java是相對C++語言是安全的語言,例如它有C++不具有的數組越界的檢查。這本身就是對自身安全的一種保護。驗證階段是Java非常重要的一個階段,它會直接的保證應用是否會被惡意入侵的一道重要的防線,越是嚴謹的驗證機制越安全。驗證的目的在于確保Class文件的字節流中包含信息符合當前虛擬機要求,不會危害虛擬機自身安全。其主要包括四種驗證,文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證。

四種驗證做進一步說明:

文件格式驗證:主要驗證字節流是否符合Class文件格式規范,并且能被當前的虛擬機加載處理。例如:主,次版本號是否在當前虛擬機處理的范圍之內。常量池中是否有不被支持的常量類型。指向常量的中的索引值是否存在不存在的常量或不符合類型的常量。

元數據驗證:對字節碼描述的信息進行語義的分析,分析是否符合java的語言語法的規范。

字節碼驗證:最重要的驗證環節,分析數據流和控制,確定語義是合法的,符合邏輯的。主要的針對元數據驗證后對方法體的驗證。保證類方法在運行時不會有危害出現。

符號引用驗證:主要是針對符號引用轉換為直接引用的時候,是會延伸到第三解析階段,主要去確定訪問類型等涉及到引用的情況,主要是要保證引用一定會被訪問到,不會出現類等無法訪問的問題。

2)準備:類準備階段負責為類的靜態變量分配內存,并設置默認初始值。

3)解析:將類的二進制數據中的符號引用替換成直接引用。說明一下:符號引用:符號引用是以一組符號來描述所引用的目標,符號可以是任何的字面形式的字面量,只要不會出現沖突能夠定位到就行。布局和內存無關。直接引用:是指向目標的指針,偏移量或者能夠直接定位的句柄。該引用是和內存中的布局有關的,并且一定加載進來的。

3.初始化

初始化是為類的靜態變量賦予正確的初始值,準備階段和初始化階段看似有點矛盾,其實是不矛盾的,如果類中有語句:private static int a = 10,它的執行過程是這樣的,首先字節碼文件被加載到內存后,先進行鏈接的驗證這一步驟,驗證通過后準備階段,給a分配內存,因為變量a是static的,所以此時a等于int類型的默認初始值0,即a=0,然后到解析(后面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時a=10。

二、類加載時機

創建類的實例,也就是new一個對象

訪問某個類或接口的靜態變量,或者對該靜態變量賦值

調用類的靜態方法

反射(Class.forName('com.lyj.load'))

初始化一個類的子類(會首先初始化子類的父類)

JVM啟動時標明的啟動類,即文件名和類名相同的那個類

除此之外,下面幾種情形需要特別指出:

對于一個final類型的靜態變量,如果該變量的值在編譯時就可以確定下來,那么這個變量相當于“宏變量”。Java編譯器會在編譯時直接把這個變量出現的地方替換成它的值,因此即使程序使用該靜態變量,也不會導致該類的初始化。反之,如果final類型的靜態Field的值不能在編譯時確定下來,則必須等到運行時才可以確定該變量的值,如果通過該類來訪問它的靜態變量,則會導致該類被初始化。

三、類加載器

類加載器負責加載所有的類,其為所有被載入內存中的類生成一個java.lang.Class實例對象。一旦一個類被加載如JVM中,同一個類就不會被再次載入了。正如一個對象有一個唯一的標識一樣,一個載入JVM的類也有一個唯一的標識。在Java中,一個類用其全限定類名(包括包名和類名)作為標識;但在JVM中,一個類用其全限定類名和其類加載器作為其唯一標識。例如,如果在pg的包中有一個名為Person的類,被類加載器ClassLoader的實例kl負責加載,則該Person類對應的Class對象在JVM中表示為(Person.pg.kl)。這意味著兩個類加載器加載的同名類:(Person.pg.kl)和(Person.pg.kl2)是不同的、它們所加載的類也是完全不同、互不兼容的。

JVM預定義有三種類加載器,當一個 JVM啟動的時候,Java開始使用如下三種類加載器:

1)根類加載器(bootstrap class loader):它用來加載 Java 的核心類,是用原生代碼來實現的,并不繼承自 java.lang.ClassLoader(負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現,不是ClassLoader子類)。由于引導類加載器涉及到虛擬機本地實現細節,開發者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。

下面程序可以獲得根類加載器所加載的核心類庫,并會看到本機安裝的Java環境變量指定的jdk中提供的核心jar包路徑:

public class ClassLoaderTest { public static void main(String[] args) { URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs(); for(URL url : urls){ System.out.println(url.toExternalForm()); } }}

運行結果:

jvm之java類加載機制和類加載器(ClassLoader)的用法

2)擴展類加載器(extensions class loader):它負責加載JRE的擴展目錄,lib/ext或者由java.ext.dirs系統屬性指定的目錄中的JAR包的類。由Java語言實現,父類加載器為null。

3)系統類加載器(system class loader):被稱為系統(也稱為應用)類加載器,它負責在JVM啟動時加載來自Java命令的-classpath選項、java.class.path系統屬性,或者CLASSPATH換將變量所指定的JAR包和類路徑。程序可以通過ClassLoader的靜態方法getSystemClassLoader()來獲取系統類加載器。如果沒有特別指定,則用戶自定義的類加載器都以此類加載器作為父加載器。由Java語言實現,父類加載器為ExtClassLoader。

類加載器加載Class大致要經過如下8個步驟:

檢測此Class是否載入過,即在緩沖區中是否有此Class,如果有直接進入第8步,否則進入第2步。

如果沒有父類加載器,則要么Parent是根類加載器,要么本身就是根類加載器,則跳到第4步,如果父類加載器存在,則進入第3步。

請求使用父類加載器去載入目標類,如果載入成功則跳至第8步,否則接著執行第5步。

請求使用根類加載器去載入目標類,如果載入成功則跳至第8步,否則跳至第7步。

當前類加載器嘗試尋找Class文件,如果找到則執行第6步,如果找不到則執行第7步。

從文件中載入Class,成功后跳至第8步。

拋出ClassNotFountException異常。

返回對應的java.lang.Class對象。

四、類加載機制:

1.JVM的類加載機制主要有如下3種。

全盤負責:所謂全盤負責,就是當一個類加載器負責加載某個Class時,該Class所依賴和引用其他Class也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入。

雙親委派:所謂的雙親委派,則是先讓父類加載器試圖加載該Class,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類。通俗的講,就是某個特定的類加載器在接到加載類的請求時,首先將加載任務委托給父加載器,依次遞歸,如果父加載器可以完成類加載任務,就成功返回;只有父加載器無法完成此加載任務時,才自己去加載。

緩存機制。緩存機制將會保證所有加載過的Class都會被緩存,當程序中需要使用某個Class時,類加載器先從緩存區中搜尋該Class,只有當緩存區中不存在該Class對象時,系統才會讀取該類對應的二進制數據,并將其轉換成Class對象,存入緩沖區中。這就是為很么修改了Class后,必須重新啟動JVM,程序所做的修改才會生效的原因。

2.這里說明一下雙親委派機制:

jvm之java類加載機制和類加載器(ClassLoader)的用法

雙親委派機制,其工作原理的是,如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器去執行,如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終將到達頂層的啟動類加載器,如果父類加載器可以完成類加載任務,就成功返回,倘若父類加載器無法完成此加載任務,子加載器才會嘗試自己去加載,這就是雙親委派模式,即每個兒子都很懶,每次有活就丟給父親去干,直到父親說這件事我也干不了時,兒子自己才想辦法去完成。

雙親委派機制的優勢:采用雙親委派模式的是好處是Java類隨著它的類加載器一起具備了一種帶有優先級的層次關系,通過這種層級關可以避免類的重復加載,當父親已經加載了該類時,就沒有必要子ClassLoader再加載一次。其次是考慮到安全因素,java核心api中定義類型不會被隨意替換,假設通過網絡傳遞一個名為java.lang.Integer的類,通過雙親委托模式傳遞到啟動類加載器,而啟動類加載器在核心Java API發現這個名字的類,發現該類已被加載,并不會重新加載網絡傳遞的過來的java.lang.Integer,而直接返回已加載過的Integer.class,這樣便可以防止核心API庫被隨意篡改。

以上這篇jvm之java類加載機制和類加載器(ClassLoader)的用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 电销卡_北京电销卡_包月电话卡-豪付网络 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 建筑资质代办-建筑资质转让找上海国信启航 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 螺旋压榨机-刮泥机-潜水搅拌机-电动泥斗-潜水推流器-南京格林兰环保设备有限公司 | 拖链电缆_柔性电缆_伺服电缆_坦克链电缆-深圳市顺电工业电缆有限公司 | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 杭州|上海贴标机-百科 | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 无锡网站建设_企业网站定制-网站制作公司-阿凡达网络 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 阿尔法-MDR2000无转子硫化仪-STM566 SATRA拉力试验机-青岛阿尔法仪器有限公司 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 次氯酸钠厂家,涉水级次氯酸钠,三氯化铁生产厂家-淄博吉灿化工 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 磁粉制动器|张力控制器|气胀轴|伺服纠偏控制器整套厂家--台灵机电官网 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 卫浴散热器,卫浴暖气片,卫生间背篓暖气片,华圣格浴室暖气片 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 艺术涂料_进口艺术涂料_艺术涂料加盟_艺术涂料十大品牌 -英国蒙太奇艺术涂料 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 制冷采购电子商务平台——制冷大市场 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 |