一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

jvm的類加載器的整體結構及過程解析

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

掃碼添加小助手

加入工程師交流群

前言

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

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

為了走進JVM,深入了解底層,王子打算寫一個JVM的專題,留下自己對JVM探索的足跡,同時也希望能幫到小伙伴們更好的理解JVM。

那我們開始吧。

JAVA代碼的運行流程

首先我們就來聊一聊JAVA代碼是怎么運行起來的,這部分比較基礎相信大家都知道,就當成是個復習吧。

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

當我們使用到哪個類的時候就會通過類加載器把class字節(jié)碼文件中的類加載到jvm內存中,然后就是在jvm內存中運行我們的代碼了。

整體的運行流程就是這樣,相信小伙伴們都很清楚這些,但是有關類加載器是如何把類加載到jvm內存中的,小伙伴們有考慮過嗎?

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

JVM什么時候加載類

其實說到類加載的底層機制,這是一個很復雜的過程,但是對于我們平時的工作來講,只要懂得它的核心原理就可以了。

一個類的加載過程會經歷如下的幾個過程:

加載、驗證、準備、解析、初始化、使用、卸載

首先我們就先弄明白一個問題,jvm是什么時候去加載類的呢?

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

而作為程序的入口,具有main方法的類,肯定是最開始的時候就加載到jvm中了。

對于加載類的時間點問題,其實就是這么簡單。

類加載器和雙親委派機制

既然我們知道了類加載的時間點,那么jvm是通過什么方式對類進行加載的呢?就是類加載器。

那接下來我們就來聊聊jvm的類加載器。

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

1.啟動類加載器

首先就是jvm啟動的第一道關口,啟動類加載器Bootstrap ClassLoader,它主要是加載java的核心類。

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

所以一旦jvm啟動,那么首先就會通過啟動類加載器去加載lib文件夾下的核心類庫。

2.擴展類加載器

然后我們就到了第二層,擴展類加載器Extension ClassLoader,這個類加載器其實與啟動類加載器是類似的。

在我們的jvm虛擬機環(huán)境目錄下,是有一個lib/ext的文件夾的,這里面的類就是java運行環(huán)境的一些擴展類,這些擴展類就是在jvm啟動后,通過擴展類加載器進行加載的。

3.應用程序類加載器

加載完核心類庫和擴展類,這時候就到了第三層,應用程序類加載器Application ClassLoader,這個類加載器你就可以理解成是加載我們寫好的java代碼的就可以了。

4.自定義類加載器

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

整體上類加載器就是這么的4層結構。很多小伙伴可能都聽說過雙親委派機制,那么什么是雙親委派機制呢,王子就和大家用最接地氣的語言描述一下。

其實很好理解,就是當我們的類加載器要加載一個類的時候,它首先會委派給它的父親去加載,但是如果它的父親沒找到就會把這個事交給他的孩子自己去完成了。

這就是雙親委派機制。

舉個例子,假如我們的應用程序類加載器要加載一個類A,那么首先它會先回家找它老爸擴展類加載器,問問“老爸,你那有這個類A嗎?”

然后擴展類加載器接到這個請求之后,同樣也懶得處理,再去找它爺爺啟動類加載器。

它爺爺找了一圈沒找到類A,很生氣,就對擴展類加載器說,“我這沒有,你自己找去!”

然后擴展類加載器就灰溜溜的自己找了一圈,同樣也沒找到,這時候就找到應用類加載器了,說:“我這哪有你這個類A,這明明是你自己應該干的活,愛上哪找上哪找去,我不管了”。

這時候應用類加載器就只能自己去處理了,找了一圈發(fā)現(xiàn)找到了類A,就把它加載到jvm內存中了。

相信大家看了這個例子應該很容易理解了吧。

所以假設我們自己創(chuàng)建了一個類java.lang.String,它是不會被應用類加載器加載到內存中的,因為父類中可以找到這個類,就直接給加載到內存中了。

聊聊驗證、準備、解析、初始化階段

聊完了加載,我們再來看看驗證、準備、解析、初始化這幾個階段jvm都做了什么。

1.驗證階段

這一步其實很容易理解,就是jvm根據(jù)java規(guī)范,來校驗你加載進來的class文件中的內容是否符合規(guī)范,如果不符合規(guī)范jvm是無法正常運行的。

所以在加載后,首先就是驗證階段。

2.準備階段

假設我們有一個類A,剛剛加載并通過了驗證,那么就會進行準備工作。

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

3.解析階段

這個階段干的事實際上是把符號引用替換為直接引用,這一過程網上有很多資料,還是比較復雜的,如果感興趣小伙伴們可以自己查閱一下資料。

實際工作中也很少會接觸這部分的內容,所以我們知道有這么個階段就可以了。

4.初始化階段

在準備階段,我們把類A的內存已經分配完了,那么初始化階段要做些什么事呢?我們先看一下類A的代碼

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

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

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

舉個例子,比如我們新建一個對象new A(),此時就會觸發(fā)從加載到初始化的全過程,把這個類準備好并創(chuàng)建一個實例對象。

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

擴展

到這里關于JVM的類加載機制其實就已經說完了,王子再給大家擴展一個小知識點。

小伙伴們想過沒有,Tomcat也是用java開發(fā)的,那么它的類加載機制是什么樣的呢,為什么就能支持jsp呢?

其實它就是利用了自定義類加載器這一機制,自己自定義了很多類加載器,整體的結構如下:

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

總結

今天我們聊的內容還是jvm中比較基礎的部分,以后的文章我們再慢慢深入,去探索jvm的底層原理,如果對JVM感興趣的小伙伴可以關注王子的后續(xù)文章哦,我們可以一步一個腳印的逐步分解JVM,去了解JVM的垃圾回收機制、性能調優(yōu)等等實用性問題,讓你面對JVM的面試或者生產實踐也可以游刃有余。

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

    關注

    20

    文章

    2989

    瀏覽量

    109749
  • JVM
    JVM
    +關注

    關注

    0

    文章

    160

    瀏覽量

    12624
  • 類加載器
    +關注

    關注

    0

    文章

    6

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    網線中十字骨架的作用

    在查看網線內部結構時,我們會發(fā)現(xiàn)在六或超六網線里,能看到一個十字骨架。但是有的六網線卻沒有。這個結構是必須的嗎?本文將詳細
    的頭像 發(fā)表于 06-24 11:13 ?449次閱讀

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

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

    將英飛凌USB串行橋接控制配置為大容量存儲 (MSC) 設備的過程是什么?

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

    CAN報文流程解析

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

    EtherCAT數(shù)據(jù)幀結構解析

    物理層和常規(guī)的以太網卡,通過獨特的數(shù)據(jù)幀結構和處理機制,實現(xiàn)了基于EtherNet的實時控制。本文將深入探討EtherCAT的數(shù)據(jù)幀結構,從幀的組成、子報文的結構、工作計數(shù)的功能到數(shù)
    的頭像 發(fā)表于 02-02 17:42 ?1324次閱讀

    【教程】DNS域名解析服務systemd-resolved使用指南

    客戶端?DNS服務?域名對應的IP地址DNS解析大致過程:?用戶在應用程序中使用域名?應用程序調用DNS客戶端申請域名解析?DNS客戶端向DNS服務
    的頭像 發(fā)表于 01-09 19:34 ?1025次閱讀
    【教程】DNS域名<b class='flag-5'>解析</b>服務systemd-resolved使用指南

    EE-240: ADSP-BF533 Blackfin加載過程

    電子發(fā)燒友網站提供《EE-240: ADSP-BF533 Blackfin加載過程.pdf》資料免費下載
    發(fā)表于 01-05 10:00 ?0次下載
    EE-240: ADSP-BF533 Blackfin<b class='flag-5'>加載</b><b class='flag-5'>過程</b>

    PyTorch 數(shù)據(jù)加載與處理方法

    ,數(shù)據(jù)加載主要依賴于 torch.utils.data 模塊,該模塊提供了 Dataset 和 DataLoader 兩個核心。 1.1 Dataset Dataset 是 P
    的頭像 發(fā)表于 11-05 17:37 ?937次閱讀

    6網線結構特點有哪些

    網線(CAT6)是網絡線纜的一種,其結構相對于五線和超五線來說更為復雜,以提供更好的傳輸性能和抗干擾能力。以下是六網線
    的頭像 發(fā)表于 09-06 09:58 ?2081次閱讀

    AWR294x主引導加載程序和輔助引導加載程序

    電子發(fā)燒友網站提供《AWR294x主引導加載程序和輔助引導加載程序.pdf》資料免費下載
    發(fā)表于 09-06 09:47 ?0次下載
    AWR294x主引導<b class='flag-5'>加載</b>程序和輔助引導<b class='flag-5'>加載</b>程序

    只讀存儲的基本結構和工作過程

    只讀存儲(Read-Only Memory,ROM)是一種重要的計算機存儲設備,它以非破壞性讀出方式工作,即只能讀出存儲的信息而無法直接寫入新的信息。這種特性使得ROM在存儲固定程序和數(shù)據(jù)方面具有獨特的優(yōu)勢。下面將詳細闡述只讀存儲的基本
    的頭像 發(fā)表于 09-05 10:43 ?2493次閱讀

    從原理聊JVM(一):染色標記和垃圾回收算法

    更好地優(yōu)化自己的代碼,并解決一些潛在的性能問題。 本文及后續(xù)文章將從原理聊起,對JVM的內存分配、GC、編譯等知識進行分析和總結。 1 JVM運行時內存劃分 1.1 運行時數(shù)據(jù)區(qū)域 ?? ? ? 方法區(qū) 屬于共享內存區(qū)域,存儲已被虛擬機
    的頭像 發(fā)表于 08-20 15:25 ?519次閱讀
    從原理聊<b class='flag-5'>JVM</b>(一):染色標記和垃圾回收算法

    labview CAN DBC加載解析程序

    labview CAN DBC加載解析程序
    發(fā)表于 08-18 11:42

    聊聊JVM如何優(yōu)化

    進行優(yōu)化。 1.JVM內存模型 針對JAVA8的模型進行討論,JVM的內存模型主要分為幾個關鍵區(qū)域:堆、方法區(qū)、程序計數(shù)、虛擬機棧和本地方法棧。堆內存進一步細分為年輕代、老年代,年輕代按其特性又分為E區(qū),S1和S2區(qū)。關于內存
    的頭像 發(fā)表于 08-05 17:49 ?763次閱讀
    聊聊<b class='flag-5'>JVM</b>如何優(yōu)化

    增強型MOS管的結構解析

    增強型MOS管(Enhancement MOSFET)是一種重要的場效應晶體管,具有高輸入阻抗、低輸入電流、高速開關和低噪聲等優(yōu)點,被廣泛應用于電子設備中。以下是對增強型MOS管結構的詳細解析。
    的頭像 發(fā)表于 07-24 10:51 ?2838次閱讀