chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

jvm的類(lèi)加載器的整體結(jié)構(gòu)及過(guò)程解析

454398 ? 來(lái)源:it610 ? 作者:H.U.C-王子 ? 2020-09-27 15:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

我們很多小伙伴平時(shí)都是做JAVA開(kāi)發(fā)的,那么作為一名合格的工程師,你是否有仔細(xì)的思考過(guò)JVM的運(yùn)行原理呢。

如果懂得了JVM的運(yùn)行原理和內(nèi)存模型,像是一些JVM調(diào)優(yōu)、垃圾回收機(jī)制等等的問(wèn)題我們才能有一個(gè)更清晰的概念。

為了走進(jìn)JVM,深入了解底層,王子打算寫(xiě)一個(gè)JVM的專(zhuān)題,留下自己對(duì)JVM探索的足跡,同時(shí)也希望能幫到小伙伴們更好的理解JVM。

那我們開(kāi)始吧。

JAVA代碼的運(yùn)行流程

首先我們就來(lái)聊一聊JAVA代碼是怎么運(yùn)行起來(lái)的,這部分比較基礎(chǔ)相信大家都知道,就當(dāng)成是個(gè)復(fù)習(xí)吧。

我們編寫(xiě)的代碼都是在java文件中編寫(xiě)的,然后會(huì)編譯成class字節(jié)碼文件。

當(dāng)我們使用到哪個(gè)類(lèi)的時(shí)候就會(huì)通過(guò)類(lèi)加載器把class字節(jié)碼文件中的類(lèi)加載到j(luò)vm內(nèi)存中,然后就是在jvm內(nèi)存中運(yùn)行我們的代碼了。

整體的運(yùn)行流程就是這樣,相信小伙伴們都很清楚這些,但是有關(guān)類(lèi)加載器是如何把類(lèi)加載到j(luò)vm內(nèi)存中的,小伙伴們有考慮過(guò)嗎?

今天我們主要就是聊這一部分。

JVM什么時(shí)候加載類(lèi)

其實(shí)說(shuō)到類(lèi)加載的底層機(jī)制,這是一個(gè)很復(fù)雜的過(guò)程,但是對(duì)于我們平時(shí)的工作來(lái)講,只要懂得它的核心原理就可以了。

一個(gè)類(lèi)的加載過(guò)程會(huì)經(jīng)歷如下的幾個(gè)過(guò)程:

加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用、卸載

首先我們就先弄明白一個(gè)問(wèn)題,jvm是什么時(shí)候去加載類(lèi)的呢?

其實(shí)答案很簡(jiǎn)單,就是我們什么時(shí)候使用到了這個(gè)類(lèi),它就去class字節(jié)碼文件中去加載這個(gè)類(lèi)。

而作為程序的入口,具有main方法的類(lèi),肯定是最開(kāi)始的時(shí)候就加載到j(luò)vm中了。

對(duì)于加載類(lèi)的時(shí)間點(diǎn)問(wèn)題,其實(shí)就是這么簡(jiǎn)單。

類(lèi)加載器和雙親委派機(jī)制

既然我們知道了類(lèi)加載的時(shí)間點(diǎn),那么jvm是通過(guò)什么方式對(duì)類(lèi)進(jìn)行加載的呢?就是類(lèi)加載器。

那接下來(lái)我們就來(lái)聊聊jvm的類(lèi)加載器。

jvm的類(lèi)加載器總體上可以分成4層,我們一起看一下。

1.啟動(dòng)類(lèi)加載器

首先就是jvm啟動(dòng)的第一道關(guān)口,啟動(dòng)類(lèi)加載器Bootstrap ClassLoader,它主要是加載java的核心類(lèi)。

相信大家都知道,無(wú)論是什么環(huán)節(jié)下運(yùn)行java程序,都是要安裝jvm虛擬機(jī)環(huán)境的,而在這個(gè)環(huán)境的目錄中是有一個(gè)lib文件夾的,這個(gè)文件下就是java最核心的類(lèi)庫(kù),支撐著java系統(tǒng)的運(yùn)行。

所以一旦jvm啟動(dòng),那么首先就會(huì)通過(guò)啟動(dòng)類(lèi)加載器去加載lib文件夾下的核心類(lèi)庫(kù)。

2.擴(kuò)展類(lèi)加載器

然后我們就到了第二層,擴(kuò)展類(lèi)加載器Extension ClassLoader,這個(gè)類(lèi)加載器其實(shí)與啟動(dòng)類(lèi)加載器是類(lèi)似的。

在我們的jvm虛擬機(jī)環(huán)境目錄下,是有一個(gè)lib/ext的文件夾的,這里面的類(lèi)就是java運(yùn)行環(huán)境的一些擴(kuò)展類(lèi),這些擴(kuò)展類(lèi)就是在jvm啟動(dòng)后,通過(guò)擴(kuò)展類(lèi)加載器進(jìn)行加載的。

3.應(yīng)用程序類(lèi)加載器

加載完核心類(lèi)庫(kù)和擴(kuò)展類(lèi),這時(shí)候就到了第三層,應(yīng)用程序類(lèi)加載器Application ClassLoader,這個(gè)類(lèi)加載器你就可以理解成是加載我們寫(xiě)好的java代碼的就可以了。

4.自定義類(lèi)加載器

前面的三層就是基本的類(lèi)加載器了,然后第四層是自定義類(lèi)加載器,根據(jù)一些特殊的需求來(lái)自己定義類(lèi)加載器加載我們的類(lèi)。

整體上類(lèi)加載器就是這么的4層結(jié)構(gòu)。很多小伙伴可能都聽(tīng)說(shuō)過(guò)雙親委派機(jī)制,那么什么是雙親委派機(jī)制呢,王子就和大家用最接地氣的語(yǔ)言描述一下。

其實(shí)很好理解,就是當(dāng)我們的類(lèi)加載器要加載一個(gè)類(lèi)的時(shí)候,它首先會(huì)委派給它的父親去加載,但是如果它的父親沒(méi)找到就會(huì)把這個(gè)事交給他的孩子自己去完成了。

這就是雙親委派機(jī)制。

舉個(gè)例子,假如我們的應(yīng)用程序類(lèi)加載器要加載一個(gè)類(lèi)A,那么首先它會(huì)先回家找它老爸?jǐn)U展類(lèi)加載器,問(wèn)問(wèn)“老爸,你那有這個(gè)類(lèi)A嗎?”

然后擴(kuò)展類(lèi)加載器接到這個(gè)請(qǐng)求之后,同樣也懶得處理,再去找它爺爺啟動(dòng)類(lèi)加載器。

它爺爺找了一圈沒(méi)找到類(lèi)A,很生氣,就對(duì)擴(kuò)展類(lèi)加載器說(shuō),“我這沒(méi)有,你自己找去!”

然后擴(kuò)展類(lèi)加載器就灰溜溜的自己找了一圈,同樣也沒(méi)找到,這時(shí)候就找到應(yīng)用類(lèi)加載器了,說(shuō):“我這哪有你這個(gè)類(lèi)A,這明明是你自己應(yīng)該干的活,愛(ài)上哪找上哪找去,我不管了”。

這時(shí)候應(yīng)用類(lèi)加載器就只能自己去處理了,找了一圈發(fā)現(xiàn)找到了類(lèi)A,就把它加載到j(luò)vm內(nèi)存中了。

相信大家看了這個(gè)例子應(yīng)該很容易理解了吧。

所以假設(shè)我們自己創(chuàng)建了一個(gè)類(lèi)java.lang.String,它是不會(huì)被應(yīng)用類(lèi)加載器加載到內(nèi)存中的,因?yàn)楦割?lèi)中可以找到這個(gè)類(lèi),就直接給加載到內(nèi)存中了。

聊聊驗(yàn)證、準(zhǔn)備、解析、初始化階段

聊完了加載,我們?cè)賮?lái)看看驗(yàn)證、準(zhǔn)備、解析、初始化這幾個(gè)階段jvm都做了什么。

1.驗(yàn)證階段

這一步其實(shí)很容易理解,就是jvm根據(jù)java規(guī)范,來(lái)校驗(yàn)?zāi)慵虞d進(jìn)來(lái)的class文件中的內(nèi)容是否符合規(guī)范,如果不符合規(guī)范jvm是無(wú)法正常運(yùn)行的。

所以在加載后,首先就是驗(yàn)證階段。

2.準(zhǔn)備階段

假設(shè)我們有一個(gè)類(lèi)A,剛剛加載并通過(guò)了驗(yàn)證,那么就會(huì)進(jìn)行準(zhǔn)備工作。

這個(gè)準(zhǔn)備工作其實(shí)就是給類(lèi)A分配一定的內(nèi)存空間,然后給里面的靜態(tài)變量(static修飾的變量)也分配內(nèi)存空間,并賦初始值。

3.解析階段

這個(gè)階段干的事實(shí)際上是把符號(hào)引用替換為直接引用,這一過(guò)程網(wǎng)上有很多資料,還是比較復(fù)雜的,如果感興趣小伙伴們可以自己查閱一下資料。

實(shí)際工作中也很少會(huì)接觸這部分的內(nèi)容,所以我們知道有這么個(gè)階段就可以了。

4.初始化階段

在準(zhǔn)備階段,我們把類(lèi)A的內(nèi)存已經(jīng)分配完了,那么初始化階段要做些什么事呢?我們先看一下類(lèi)A的代碼

public class A {
    private static String i=System.getProperty("i");
}

準(zhǔn)備階段我們只是給變量i分配了內(nèi)存空間,并賦值了初始值,但是后邊的System.getProperty("i")是不會(huì)執(zhí)行的。

沒(méi)錯(cuò),這部分代碼就是在初始化階段執(zhí)行的,另外靜態(tài)代碼塊也會(huì)在這一階段執(zhí)行。

舉個(gè)例子,比如我們新建一個(gè)對(duì)象new A(),此時(shí)就會(huì)觸發(fā)從加載到初始化的全過(guò)程,把這個(gè)類(lèi)準(zhǔn)備好并創(chuàng)建一個(gè)實(shí)例對(duì)象。

此外這里有一個(gè)規(guī)則,如果類(lèi)A繼承了類(lèi)B,那么在初始化類(lèi)A的時(shí)候,如果發(fā)現(xiàn)類(lèi)B還沒(méi)有初始化,會(huì)先初始化類(lèi)B。

擴(kuò)展

到這里關(guān)于JVM的類(lèi)加載機(jī)制其實(shí)就已經(jīng)說(shuō)完了,王子再給大家擴(kuò)展一個(gè)小知識(shí)點(diǎn)。

小伙伴們想過(guò)沒(méi)有,Tomcat也是用java開(kāi)發(fā)的,那么它的類(lèi)加載機(jī)制是什么樣的呢,為什么就能支持jsp呢?

其實(shí)它就是利用了自定義類(lèi)加載器這一機(jī)制,自己自定義了很多類(lèi)加載器,整體的結(jié)構(gòu)如下:

Tomcat自定義了這么多的類(lèi)加載器,用來(lái)加載它自己的核心類(lèi)庫(kù),并且Tomcat是打破了雙親委派機(jī)制的,感興趣的小伙伴可以自己去查資料了解一下,王子就不在本篇文章長(zhǎng)篇大論來(lái)聊Tomcat了。

總結(jié)

今天我們聊的內(nèi)容還是jvm中比較基礎(chǔ)的部分,以后的文章我們?cè)俾钊?,去探索jvm的底層原理,如果對(duì)JVM感興趣的小伙伴可以關(guān)注王子的后續(xù)文章哦,我們可以一步一個(gè)腳印的逐步分解JVM,去了解JVM的垃圾回收機(jī)制、性能調(diào)優(yōu)等等實(shí)用性問(wèn)題,讓你面對(duì)JVM的面試或者生產(chǎn)實(shí)踐也可以游刃有余。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3001

    瀏覽量

    116453
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    161

    瀏覽量

    13038
  • 類(lèi)加載器
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    1031
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    BNC連接線束屏蔽結(jié)構(gòu)與抗干擾解析

    本文深入解析 BNC 連接線束的屏蔽結(jié)構(gòu)與抗干擾機(jī)理,詳細(xì)說(shuō)明同軸屏蔽方式、連接結(jié)構(gòu)及加工工藝對(duì) EMI 抑制和傳輸穩(wěn)定性的影響,幫助工
    的頭像 發(fā)表于 02-03 09:58 ?527次閱讀
    BNC連接<b class='flag-5'>器</b>線束屏蔽<b class='flag-5'>結(jié)構(gòu)</b>與抗干擾<b class='flag-5'>解析</b>

    TAS2780數(shù)字輸入單聲道D類(lèi)音頻放大器深度解析

    TAS2780數(shù)字輸入單聲道D類(lèi)音頻放大器深度解析 引言 在音頻設(shè)備設(shè)計(jì)領(lǐng)域,功率放大器的性能對(duì)整體音質(zhì)起著決定性作用。德州儀器(TI)的TAS2780數(shù)字輸入單聲道D類(lèi)音頻放大器,以
    的頭像 發(fā)表于 01-29 09:30 ?346次閱讀

    解析MAX98366:15V即插即用D類(lèi)放大器的技術(shù)亮點(diǎn)與應(yīng)用實(shí)踐

    解析MAX98366:15V即插即用D類(lèi)放大器的技術(shù)亮點(diǎn)與應(yīng)用實(shí)踐 在電子音頻設(shè)備設(shè)計(jì)領(lǐng)域,放大器的性能直接影響著音頻的質(zhì)量和設(shè)備的整體表現(xiàn)。今天,我們來(lái)深入探討一款備受關(guān)注的產(chǎn)品——Analog
    的頭像 發(fā)表于 01-16 14:25 ?203次閱讀

    超五類(lèi)與六類(lèi)水晶頭:網(wǎng)絡(luò)連接的基石解析

    和適用場(chǎng)景。本文將深入解析這兩種水晶頭的區(qū)別、優(yōu)勢(shì)及選擇建議,幫助讀者更好地理解和應(yīng)用。 一、超五類(lèi)水晶頭:經(jīng)濟(jì)實(shí)惠的選擇 特點(diǎn): 傳輸性能:超五類(lèi)水晶頭支持最高1000Mbps的傳輸速率,適用于大多數(shù)家庭和小型辦公室的網(wǎng)絡(luò)需求
    的頭像 發(fā)表于 01-15 09:49 ?114次閱讀

    汽車(chē)類(lèi) CAN 收發(fā) TCAN1042-Q1 系列:設(shè)計(jì)與應(yīng)用全解析

    汽車(chē)類(lèi) CAN 收發(fā) TCAN1042-Q1 系列:設(shè)計(jì)與應(yīng)用全解析 在汽車(chē)電子和工業(yè)控制領(lǐng)域,CAN(Controller Area Network)總線作為一種可靠的通信協(xié)議,廣泛應(yīng)用于各種
    的頭像 發(fā)表于 12-19 16:05 ?444次閱讀

    TCAN1042-Q1汽車(chē)類(lèi)CAN收發(fā):設(shè)計(jì)與應(yīng)用全解析

    TCAN1042-Q1汽車(chē)類(lèi)CAN收發(fā):設(shè)計(jì)與應(yīng)用全解析 在汽車(chē)電子領(lǐng)域,CAN(Controller Area Network)總線作為一種可靠的通信方式,廣泛應(yīng)用于各種汽車(chē)系統(tǒng)中。而CAN
    的頭像 發(fā)表于 12-19 14:30 ?403次閱讀

    圖撲軟件 3D 場(chǎng)景預(yù)加載應(yīng)用實(shí)現(xiàn)

    預(yù)加載是在進(jìn)入正式場(chǎng)景之前提前加載所需模型、材質(zhì)、圖片等資源的技術(shù)手段,其核心價(jià)值在于消除資源加載等待,確保場(chǎng)景首次渲染即可完整呈現(xiàn),從而提供無(wú)縫、流暢的用戶(hù)體驗(yàn)。在復(fù)雜的 Web 3D 可視化
    的頭像 發(fā)表于 12-01 16:04 ?553次閱讀
    圖撲軟件 3D 場(chǎng)景預(yù)<b class='flag-5'>加載</b>應(yīng)用實(shí)現(xiàn)

    BNC防水連接結(jié)構(gòu)特點(diǎn)、應(yīng)用場(chǎng)景與線束定制全解析

    文章全面解析 BNC 防水連接結(jié)構(gòu)、防水等級(jí)、應(yīng)用場(chǎng)景、技術(shù)參數(shù)、線束加工要點(diǎn)及工程師選型建議,適用于監(jiān)控、戶(hù)外通信、工業(yè)設(shè)備等行業(yè),提供專(zhuān)業(yè) BNC 防水線束定制方案。
    的頭像 發(fā)表于 11-26 15:23 ?563次閱讀
    BNC防水連接<b class='flag-5'>器</b>:<b class='flag-5'>結(jié)構(gòu)</b>特點(diǎn)、應(yīng)用場(chǎng)景與線束定制全<b class='flag-5'>解析</b>

    Linux內(nèi)核模塊的加載機(jī)制

    。Linux內(nèi)核模塊的加載過(guò)程主要包含了ELF解析、動(dòng)態(tài)鏈接、安全驗(yàn)證和資源管理技術(shù)。其核心步驟包括:權(quán)限檢查→ELF解析→符號(hào)重定位→依賴(lài)加載
    發(fā)表于 11-25 06:59

    類(lèi)網(wǎng)線中十字骨架的作用

    在查看網(wǎng)線內(nèi)部結(jié)構(gòu)時(shí),我們會(huì)發(fā)現(xiàn)在六類(lèi)或超六類(lèi)網(wǎng)線里,能看到一個(gè)十字骨架。但是有的六類(lèi)網(wǎng)線卻沒(méi)有。這個(gè)結(jié)構(gòu)是必須的嗎?本文將詳細(xì)
    的頭像 發(fā)表于 06-24 11:13 ?2114次閱讀

    鴻蒙5開(kāi)發(fā)寶藏案例分享---Web加載時(shí)延優(yōu)化解析

    : Network泳道 :查看資源加載時(shí)序 Main泳道 :監(jiān)控JS/CSS解析阻塞 Performance面板 :定位長(zhǎng)任務(wù)(Long Tasks) ??** 四大優(yōu)化方向 + 代碼實(shí)戰(zhàn)** 以下
    發(fā)表于 06-12 17:11

    MCU存儲(chǔ)層次結(jié)構(gòu)解析

    ? ? ? ?MCU的存儲(chǔ)層次結(jié)構(gòu)通過(guò)整合不同性能與功能的存儲(chǔ)單元,優(yōu)化系統(tǒng)效率并滿(mǎn)足多樣化場(chǎng)景需求。其核心架構(gòu)可分為以下層次: 一、寄存層(最高速) 定位?:集成于CPU內(nèi)核中,直接參與運(yùn)算
    的頭像 發(fā)表于 05-09 10:21 ?797次閱讀

    將英飛凌USB串行橋接控制配置為大容量存儲(chǔ)類(lèi) (MSC) 設(shè)備的過(guò)程是什么?

    將英飛凌 USB 串行橋接控制配置為大容量存儲(chǔ)類(lèi) (MSC) 設(shè)備的過(guò)程是什么? 我對(duì) CY7C65214 或 CY7C65215 部件的支持特別感興趣。
    發(fā)表于 05-07 07:52

    十種主流電機(jī)拆解全解析:內(nèi)部結(jié)構(gòu)大揭秘!

    點(diǎn)擊附件查看全文*附件:十種主流電機(jī)拆解全解析:內(nèi)部結(jié)構(gòu)大揭秘!.doc (免責(zé)聲明:本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)第一時(shí)間告知,刪除內(nèi)容?。?
    發(fā)表于 04-01 14:25

    CAN報(bào)文流程解析

    CAN報(bào)文流程解析,直流充電樁上的CAN通訊解析過(guò)程
    發(fā)表于 03-24 14:03 ?10次下載