色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

454398 ? 來源:it610 ? 作者:H.U.C-王子 ? 2020-09-27 15:49 ? 次閱讀

前言

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

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

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

那我們開始吧。

JAVA代碼的運行流程

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

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

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

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

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

JVM什么時候加載類

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

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

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

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

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

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

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

類加載器和雙親委派機制

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

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

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

1.啟動類加載器

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

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

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

2.擴展類加載器

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

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

3.應用程序類加載器

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

4.自定義類加載器

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

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

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

這就是雙親委派機制。

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

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

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

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

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

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

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

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

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

1.驗證階段

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

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

2.準備階段

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

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

3.解析階段

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

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

4.初始化階段

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

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

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

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

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

此外這里有一個規則,如果類A繼承了類B,那么在初始化類A的時候,如果發現類B還沒有初始化,會先初始化類B。

擴展

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

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

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

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

總結

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

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

    關注

    19

    文章

    2966

    瀏覽量

    104702
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12220
  • 類加載器
    +關注

    關注

    0

    文章

    6

    瀏覽量

    928
收藏 人收藏

    評論

    相關推薦

    PyTorch 數據加載與處理方法

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

    6網線結構特點有哪些

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

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

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

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

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

    labview CAN DBC加載解析程序

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

    聊聊JVM如何優化

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

    增強型MOS管的結構解析

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

    卷積神經網絡的基本結構和訓練過程

    處理具有空間層次結構的數據時表現出色。本文將從卷積神經網絡的歷史背景、基本原理、網絡結構、訓練過程以及應用領域等方面進行詳細闡述,以期全面解析這一重要算法。
    的頭像 發表于 07-02 18:27 ?857次閱讀

    PLC基本結構解析

    方式和便捷的編程方式,被廣泛應用于各種工業控制系統中。本文將詳細解析PLC的基本結構,包括其主要組成部分的功能和特點,以便讀者對PLC有更深入的了解。
    的頭像 發表于 06-25 14:30 ?939次閱讀

    解析經典藍牙設備連接過程

    應用中,藍牙設備發現、連接、斷開等使用場景較為常見,其中設備連接是至關重要的一環,它涵蓋了設備之間建立連接的整個過程。本文將對經典藍牙設備連接過程進行解析,帶大家一起了解連接的整個過程
    的頭像 發表于 06-05 09:11 ?2199次閱讀
    <b class='flag-5'>解析</b>經典藍牙設備連接<b class='flag-5'>過程</b>

    并行加載8位寄存數據表

    電子發燒友網站提供《并行加載8位寄存數據表.pdf》資料免費下載
    發表于 05-22 09:41 ?0次下載
    并行<b class='flag-5'>加載</b>8位寄存<b class='flag-5'>器</b>數據表

    【AWTK使用經驗】加載和釋放外部圖片

    AWTK是基于C語言開發的跨平臺GUI框架。《AWTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度條?這些都會在系列文章進行解答。加載
    的頭像 發表于 04-26 08:25 ?471次閱讀
    【AWTK使用經驗】<b class='flag-5'>加載</b>和釋放外部圖片

    鴻蒙原生應用開發-ArkTS語言基礎庫概述

    線程之間進行通信,開發者需要主動創建和關閉Worker線程。 2.提供常見的容器庫增、刪、改、查的能力。 3.提供XML、URL、URI構造和解析的能力。 XML被設計用來傳輸和存儲數據,是一種可
    發表于 03-05 15:42

    ArkTS語言基礎庫-解析

    多線程并發,支持Worker線程和宿主線程之間進行通信,開發者需要主動創建和關閉Worker線程。 提供常見的[容器庫增、刪、改、查]的能力。 提供XML、URL、URI構造和解析的能力。 XML
    發表于 02-20 16:44

    在BF707開發過程中向Flash燒寫一段代碼,然后斷電進行加載,發現并未加載成功如何解決?

    在BF707開發過程中向Flash中燒寫過一段代碼,然后斷電進行加載,發現并未加載成功,當進行如下操作卻失敗】 1.利用CCES仿真,在debug情況下對JTAG進行Test結果為
    發表于 01-12 06:03
    主站蜘蛛池模板: 快播h网站| 37大但人文艺术A级都市天气| 国产精品成人A蜜柚在线观看| 色 花 堂 永久 网站| 啊叫大点声欠CAO的SAO贷| 奇虎成人网| 成人免费视频在线观看| 日本乱子伦一区二区三区| 嘟嘟嘟在线视频免费观看高清中文| 日韩精品久久久久久久电影| 大睾丸内射老师| 色欲精品国产AV久久久| 国产精品成人观看视频免费| 无码国产成人777爽死| 国产毛A片啊久久久久久A| 亚洲国产精品高清在线 | 试看做受120秒免费午夜剧场| 丰满少妇69激懒啪啪无码| 我的漂亮朋友在线观看全集免费| 国产精品亚洲精品久久国语| 亚洲成AV人电影在线观看| 江苏电台在线收听| 一级做a爰片久久毛片一| 老人FREE VIODES老少配| 99久久香蕉| 日本欧美久久久久免费播放网| 国产av在线看的| 亚洲国产果果在线播放在线| 久久精品免费看网站| 97精品视频在线观看| 人人爽天天碰狠狠添| 国产精品99久久久久久动态图 | 呻吟翘臀后进爆白浆| 国产免费人成在线视频有码| 野草在线视频完整视频| 美女议员被泄裸照| 和姐姐做插得很深| 精品AV亚洲乱码一区二区| 两个人的视频日本在线观看完整| 男人吃奶摸下弄进去好爽| 肉伦禁忌小说np|