国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java虛擬機(jī)如何加載類的?

TANKING / 2159人閱讀

摘要:虛擬機(jī)有個一加載機(jī)制,叫做雙親委派模型。擴(kuò)展類加載器擴(kuò)展類加載器的父類的加載器是啟動類加載器。驗(yàn)證驗(yàn)證的目的就是需要符合虛擬機(jī)的規(guī)范。虛擬機(jī)會通過加鎖的方式確保方法只執(zhí)行一次。

引言

上一篇文章談到Java運(yùn)行的流程,其中有一環(huán)是類加載。今天就繼續(xù)深入探討JVM如何加載虛擬機(jī)。
首先JVM加載類的一般流程分三步:
·加載
·鏈接
·初始化
那么是否全部Java類都是這樣三步走的方式加載呢?我們可以從Java的數(shù)據(jù)類型去出發(fā)。Java分基本類型和引用類型。其中按照面向?qū)ο蟮奶匦裕磺薪詫ο螅敲磳τ诨绢愋鸵矐?yīng)該是對象。但是為了在執(zhí)行效率和內(nèi)存占用上進(jìn)行調(diào)優(yōu),Java將基本類型特殊處理。所以Java基本類型加載都是Java虛擬機(jī)預(yù)先定義好了,所以沒有加載這個步驟了。引用類型就是類,接口,數(shù)組。其中數(shù)組是直接由虛擬機(jī)直接生成的。類和接口是字節(jié)流,都是需要加載。

正文 Java基本類型

首先先看下基本類型的默認(rèn)值和值域。

總結(jié)
1.無符號類型:boolean和char
2.boolean在Java虛擬機(jī)中,根據(jù)虛擬機(jī)規(guī)范轉(zhuǎn)換為int類型,false為0,true為1

引用類型

引用類型中的數(shù)組是直接由Java虛擬機(jī)直接生成,接下來直接講類和接口。為了敘述方便直接統(tǒng)稱為類。類的加載分三步。

加載

加載是通過加載器進(jìn)行加載的。Java虛擬機(jī)有個一加載機(jī)制,叫做雙親委派模型。具體就是當(dāng)一個類加載器拿到這個類的時候先給自己的父類加載器進(jìn)行加載,如果父類加載器沒有找到所請求的類,才會給該類加載器。還是挺尊老愛幼的。那么加載器有很多中,在Java9之前分三類。Java9之后分兩類。

分類:
Java9之前
·啟動類加載器:負(fù)責(zé)加載最為基礎(chǔ)和最為重要的類。比如存放在jre的lib目錄的jar包中的類以及虛擬機(jī)參數(shù)-Xbootclasspath指定的類。
·擴(kuò)展類加載器:擴(kuò)展類加載器的父類的加載器是啟動類加載器。擴(kuò)展類加載器加載相對次要但是又通用的類。比如jre中l(wèi)ib/ext目錄下的jar包中的類以及由系統(tǒng)變量java.ext.dir指定的類。
·應(yīng)用類加載器:應(yīng)用類加載器的父類加載器是擴(kuò)展類加載器。負(fù)責(zé)加載應(yīng)用加載應(yīng)用程序路徑的類(這里的應(yīng)用程序的路徑就是虛擬機(jī)參數(shù)-cp/-classpath,系統(tǒng)變量java.class.path或環(huán)境變量CLASSPATH指定的路徑)。

Java9之后
啟動類加載器:同上
平臺類加載器:Java9引入模塊系統(tǒng),所以除了少數(shù)的幾個關(guān)鍵模塊是用啟動類加載器加載,其余的都有平臺類加載器加載。

類加載器除了提供加載功能,還提供命名空間的功能,這個就很像Java的包名一樣。即時是同一個類,經(jīng)過不同的類加載器,命名不同那這兩個類也是不是同一個類。

鏈接

何為鏈接,就是講加載的類合并至Java虛擬機(jī),使之能夠執(zhí)行的過程。具體流程可以分類驗(yàn)證,準(zhǔn)備以及解析三個過程。
驗(yàn)證:驗(yàn)證的目的就是需要符合Java虛擬機(jī)的規(guī)范。
準(zhǔn)備:為加載類的靜態(tài)字段分配內(nèi)存,部分Java虛擬機(jī)還會在這階段構(gòu)造其他跟類層次相關(guān)的數(shù)據(jù)結(jié)構(gòu),比如說用來實(shí)現(xiàn)虛方法的動態(tài)綁定的方法表。
解析:當(dāng)class文件加載到虛擬機(jī)之前這個類不知道自己的成員變量和成員方法的地址,所以編譯器會生成一個符號引用,這個符號應(yīng)用包括所在類的名字,目標(biāo)方法的名字,接收參數(shù)類型以及返回類型。解析就是將這個符號引用轉(zhuǎn)化為實(shí)際引用。如果符號引用指向的類沒有加載,那么會觸發(fā)這個類進(jìn)行加載,但是不會鏈接和初始化。

Java虛擬機(jī)規(guī)范并沒有要求鏈接過程完成解析,如果某些字節(jié)碼使用了符號引用,那么在執(zhí)行這些字節(jié)碼之前,需要完成解析。

初始化

初始化就是初始化靜態(tài)字段,如果靜態(tài)字段被final修改,那么該字段就會被標(biāo)記為常量值,其初始化直接由Java虛擬機(jī)完成。其他的初始化靜態(tài)字段的代碼Java編譯器會放在一個方法中并且命名為.
初始化就是為常量值直接賦值和執(zhí)行方法的過程。Java虛擬機(jī)會通過加鎖的方式確保方法只執(zhí)行一次。
那么什么時候會觸發(fā)初始化:
1.當(dāng)虛擬機(jī)啟動,初始化用戶指定的類。
2.當(dāng)遇到用以新建目標(biāo)類實(shí)例的new指令時,初始化new指令的目標(biāo)類。
3.當(dāng)遇到調(diào)用靜態(tài)方法的指令時,初始化該靜態(tài)方法所在的類。
4.但遇到訪問靜態(tài)字段的指令時,初始化該靜態(tài)字段所在的類。
5.子類的初始化會觸發(fā)父類的初始化。
6.如果接口定義了default方法,那么直接實(shí)現(xiàn)或者間接實(shí)現(xiàn)該接口的類的初始化,會觸發(fā)該接口的初始化。
7.使用反射API對某個類進(jìn)行反射調(diào)用時,會初始化該類。
8.當(dāng)初次調(diào)用MethodHandle實(shí)例時,初始化該MethodHandle指向的方法所在的類。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73524.html

相關(guān)文章

  • 類的加載機(jī)

    摘要:如果沒有,那必須先執(zhí)行相應(yīng)的類加載過程。分配內(nèi)存在類加載檢查通過后,接下來虛擬機(jī)將為新生對象分配內(nèi)存。程序計(jì)數(shù)器主要有兩個作用字節(jié)碼解釋器通過改變程序計(jì)數(shù)器來依次讀取指令,從而實(shí)現(xiàn)代碼的流程控制,如順序執(zhí)行選擇循環(huán)異常處理。 目錄介紹 01.Java對象的創(chuàng)建過程 1.0 看下創(chuàng)建類加載過程 1.1 對象的創(chuàng)建 1.2 對象的內(nèi)存布局 02.Java內(nèi)存區(qū)域 2.0 運(yùn)行...

    mikyou 評論0 收藏0
  • JAVA 虛擬機(jī)加載機(jī)制和字節(jié)碼執(zhí)行引擎

    摘要:實(shí)現(xiàn)這個口號的就是可以運(yùn)行在不同平臺上的虛擬機(jī)和與平臺無關(guān)的字節(jié)碼。類加載過程加載加載是類加載的第一個階段,虛擬機(jī)要完成以下三個過程通過類的全限定名獲取定義此類的二進(jìn)制字節(jié)流。驗(yàn)證目的是確保文件字節(jié)流信息符合虛擬機(jī)的要求。 引言 我們知道java代碼編譯后生成的是字節(jié)碼,那虛擬機(jī)是如何加載這些class字節(jié)碼文件的呢?加載之后又是如何進(jìn)行方法調(diào)用的呢? 一 類文件結(jié)構(gòu) 無關(guān)性基石 ja...

    RichardXG 評論0 收藏0
  • 類的加載機(jī)制,雙親委派模型,搞定大廠高頻面試題

    摘要:驗(yàn)證驗(yàn)證是連接階段的第一步,這一階段的目的是為了確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全。字節(jié)碼驗(yàn)證通過數(shù)據(jù)流和控制流分析,確定程序語義是合法的符合邏輯的。 看過這篇文章,大廠面試你「雙親委派模型」,硬氣的說一句,你怕啥? 讀該文章姿勢 打開手頭的 IDE,按照文章內(nèi)容及思路進(jìn)行代碼跟蹤與思考 手頭沒有 IDE,先收藏,回頭看 (萬一哪次面試問...

    Object 評論0 收藏0
  • java加載機(jī)

    摘要:在加載階段,虛擬機(jī)要完成件事情通過一個類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。前面的階段中,除了加載的時候,可以由用戶指定自定義類加載器之外,別的都是由虛擬機(jī)主導(dǎo)控制。 java類加載機(jī)制 代碼編譯的結(jié)果從本地機(jī)器碼轉(zhuǎn)變?yōu)樽止?jié)碼,是存儲格式發(fā)展的一小步,確實(shí)編程語言發(fā)展的一大步 虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直...

    garfileo 評論0 收藏0
  • Java 虛擬機(jī)加載機(jī)

    摘要:驗(yàn)證驗(yàn)證階段的主要目的是為了確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全。不同的虛擬機(jī)對類驗(yàn)證的實(shí)現(xiàn)可能會有所不同,但大致都會完成以下四個階段的驗(yàn)證文件格式的驗(yàn)證元數(shù)據(jù)的驗(yàn)證字節(jié)碼驗(yàn)證和符號引用驗(yàn)證。 原文地址 虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗(yàn),轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型,Thisis ...

    Dionysus_go 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<