中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站建設(shè)編寫代碼出錯(cuò)東莞seo優(yōu)化推廣

網(wǎng)站建設(shè)編寫代碼出錯(cuò),東莞seo優(yōu)化推廣,做音頻后期的素材網(wǎng)站,自己做的網(wǎng)站如何讓別人訪問(wèn)文章目錄類的加載1、Java程序如何運(yùn)行2、Java字節(jié)碼文件3、類加載4、類加載的過(guò)程5、類加載器6、類的加載方式7、類的加載機(jī)制8、雙親委派機(jī)制9、破壞雙親委派機(jī)制類的加載 1、Java程序如何運(yùn)行 首先通過(guò)Javac命令將.java文件編譯生成.class字節(jié)碼文件。 Javac是Java編譯命令&a…

文章目錄

  • 類的加載
    • 1、Java程序如何運(yùn)行
    • 2、Java字節(jié)碼文件
    • 3、類加載
    • 4、類加載的過(guò)程
    • 5、類加載器
    • 6、類的加載方式
    • 7、類的加載機(jī)制
    • 8、雙親委派機(jī)制
    • 9、破壞雙親委派機(jī)制

類的加載

在這里插入圖片描述

1、Java程序如何運(yùn)行

  • 首先通過(guò)Javac命令將.java文件編譯生成.class字節(jié)碼文件。
    Javac是Java編譯命令,編譯過(guò)程分為四步。

    1. 詞法解析,通過(guò)空格分隔出單詞、操作符、控制符等信息,形成信息流傳遞給語(yǔ)法解析器。
    2. 語(yǔ)法解析,將信息流按照J(rèn)ava語(yǔ)法規(guī)則組裝成語(yǔ)法樹(shù)。
    3. 語(yǔ)義分析,檢查類型是否匹配、關(guān)鍵詞是否使用合理、作用域是否正確等。
    4. 字節(jié)碼生產(chǎn),將經(jīng)過(guò)1、2、3步驟生產(chǎn)的新型轉(zhuǎn)換為字節(jié)碼。
  • .class文件加載到JVM中經(jīng)過(guò)一系列類加載流程,由解釋器解釋執(zhí)行和JIT即時(shí)編譯器將字節(jié)碼文件編譯成本地機(jī)器碼執(zhí)行。

    字節(jié)碼必須通過(guò)類加載機(jī)制加載到JVM后方能執(zhí)行,執(zhí)行有三種模式,解釋執(zhí)行、JIT編譯執(zhí)行、JIT編譯和解釋器混合執(zhí)行(主流JVM默認(rèn)執(zhí)行的方式)。混合模式優(yōu)勢(shì)在于解釋器在啟動(dòng)時(shí)先解釋執(zhí)行,節(jié)省編譯時(shí)間。
    解釋執(zhí)行: 來(lái)一行代碼,解釋一行,大部分不常用的代碼,采用此種方式
    即時(shí)編譯: 對(duì)于部分熱點(diǎn)代碼,虛擬機(jī)將該部分字節(jié)碼編譯生成機(jī)器指令,以提高Java虛擬機(jī)的運(yùn)行效率

  • CPU調(diào)度線程執(zhí)行本地機(jī)器碼


2、Java字節(jié)碼文件

Class文件本質(zhì)上是一個(gè)以字節(jié)為基礎(chǔ)單位的二進(jìn)制流,各個(gè)數(shù)據(jù)項(xiàng)目嚴(yán)格按照順序緊湊的排列在class文件中。JVM根據(jù)其特定的規(guī)則解析該二進(jìn)制數(shù)據(jù),從而得到相關(guān)信息。Class文件采用一種偽結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),它有兩種類型:無(wú)符號(hào)數(shù)和表。

Class文件的結(jié)構(gòu)屬性:

  1. 魔數(shù)與class文件的版本:class文件頭4個(gè)字節(jié)稱為魔數(shù),是class文件的標(biāo)識(shí)
  2. 常量池:class文件的資源倉(cāng)庫(kù),存儲(chǔ)變量的屬性、類型和名稱;方法的屬性、類型和名稱等。
  3. 訪問(wèn)標(biāo)志:表示該class的屬性和訪問(wèn)類型,比如class是類還是接口,訪問(wèn)類型是public、private,類型是否被標(biāo)記為final
  4. 類索引、父類索引、接口索引:一種描述的數(shù)據(jù)項(xiàng)目,class文件憑此確定類的繼承和實(shí)現(xiàn)關(guān)系
  5. 字段表屬性:描述類或接口中聲明的變量。比如變量的作用域(public、private、protected)、是否是靜態(tài)變量(static)、可變性(final)、數(shù)據(jù)類型(基本數(shù)據(jù)類型、對(duì)象、數(shù)組)等
  6. 方法表屬性:描述方法的類型、作用域、返回值、參數(shù)、是否是重寫或重載
  7. 屬性表屬性:描述某些場(chǎng)景專有的信息。比如字段表中的特殊屬性、方法表中的特殊屬性。

3、類加載

Class 文件中描述的各類信息都需要加載到虛擬機(jī)后才能使用。JVM 把描述類的數(shù)據(jù)從 Class 文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行加載、驗(yàn)證、解析和初始化,最終形成可以被虛擬機(jī)直接使用的 數(shù)據(jù)類型,這個(gè)過(guò)程稱為虛擬機(jī)的類加載過(guò)程。

與編譯時(shí)需要連接的語(yǔ)言不同,Java 中類型的加載、連接和初始化都是在運(yùn)行期間完成的,這增加了性能開(kāi)銷,但卻提供了極高的擴(kuò)展性,Java 動(dòng)態(tài)擴(kuò)展的語(yǔ)言特性就是依賴運(yùn)行期動(dòng)態(tài)加載和連接實(shí)現(xiàn)的。


4、類加載的過(guò)程

一個(gè)類從被加載到虛擬機(jī)內(nèi)存開(kāi)始,到卸載出內(nèi)存為止,整個(gè)生命周期經(jīng)歷加載驗(yàn)證、準(zhǔn)備、解析、初始化、使用和卸載七個(gè)階段,其中驗(yàn)證、解析和初始化三個(gè)部分稱為連接。加載、驗(yàn)證、準(zhǔn)備、初始化階段開(kāi)始的先后順序是確定的,解析則不一定:可能在初始化之后再開(kāi)始,這是為了支持 Java 語(yǔ)言的動(dòng)態(tài)綁定。
在這里插入圖片描述

  1. 加載:查找并加載類的二進(jìn)制數(shù)據(jù)
    在加載階段,虛擬機(jī)需要完成以下三個(gè)步驟:

    • 通過(guò)一個(gè)類的全限定名來(lái)獲取其定義的二進(jìn)制字節(jié)流。
    • 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。
    • 在Java堆內(nèi)存中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為對(duì)方法區(qū)中這些數(shù)據(jù)的訪問(wèn)入口。
  2. 驗(yàn)證: 確保被加載類的正確性
    確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。驗(yàn)證分為4個(gè)階段:文件格式驗(yàn)證、元數(shù)據(jù)驗(yàn)證、字節(jié)碼驗(yàn)證、符號(hào)引用驗(yàn)證。

驗(yàn)證階段是非常重要的,但不是必須的,它對(duì)程序運(yùn)行期沒(méi)有影響,如果所引用的類經(jīng)過(guò)反復(fù)驗(yàn)證,那么可以考慮采用-Xverifynone參數(shù)來(lái)關(guān)閉大部分的類驗(yàn)證措施,以縮短虛擬機(jī)類加載的時(shí)間。

  1. 準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值
    準(zhǔn)備階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值零值的階段,這些內(nèi)存都將在方法區(qū)中分配。
    注: 此時(shí)分配的是類變量(static),不包括實(shí)例變量。初始化的值是數(shù)據(jù)類型的默認(rèn)零值,比如0、0L、null、false 等。

  2. 解析:把類中的符號(hào)引用轉(zhuǎn)換為直接引用
    解析階段是虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過(guò)程,解析動(dòng)作主要針對(duì)類或接口、字段、類方法、接口方法、方法類型、方法句柄和調(diào)用點(diǎn)限定符7類符號(hào)引用進(jìn)行。符號(hào)引用就是一組符號(hào)來(lái)描述目標(biāo),可以是任何字面量。

直接引用就是直接指向目標(biāo)的指針、相對(duì)偏移量或一個(gè)間接定位到目標(biāo)的句柄

  1. 初始化:JVM對(duì)類進(jìn)行初始化賦值
    為類的靜態(tài)變量賦予正確的初始值,JVM負(fù)責(zé)對(duì)類進(jìn)行初始化,主要對(duì)類變量進(jìn)行初始化。

在Java中對(duì)類變量進(jìn)行初始值設(shè)定有兩種方式:

  • 聲明類變量是指定初始值
  • 使用靜態(tài)代碼塊為類變量指定初始值

JVM初始化步驟:

  • 假如這個(gè)類還沒(méi)有被加載和連接,則程序先加載并連接該類
  • 假如該類的直接父類還沒(méi)有被初始化,則先初始化其直接父類
  • 假如類中有初始化語(yǔ)句,則系統(tǒng)依次執(zhí)行這些初始化語(yǔ)句
  1. 使用:使用類的對(duì)象實(shí)例
    類訪問(wèn)方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口, 對(duì)象是堆區(qū)的數(shù)據(jù)。
  2. 卸載:類被卸載出內(nèi)存
    Java虛擬機(jī)結(jié)束,類被卸載出內(nèi)存。
    Java虛擬機(jī)結(jié)束生命周期的情況:
    • 執(zhí)行了System.exit()方法
    • 程序正常執(zhí)行結(jié)束
    • 程序在執(zhí)行過(guò)程中遇到了異常或錯(cuò)誤而異常終止
    • 由于操作系統(tǒng)出現(xiàn)錯(cuò)誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止

5、類加載器

啟動(dòng)類加載器:
Bootstrap ClassLoader,負(fù)責(zé)加載存放在JDK的安裝目錄下的jre\lib中,或被-Xbootclasspath參數(shù)指定的路徑中的,并且能被虛擬機(jī)識(shí)別的類庫(kù)(如rt.jar,所有的java.*開(kāi)頭的類均被Bootstrap ClassLoader加載)。啟動(dòng)類加載器是無(wú)法被Java程序直接引用的。

擴(kuò)展類加載器:

Extension ClassLoader,該加載器由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn),它負(fù)責(zé)加載JDK安裝目錄下的jre\lib\ext目錄中,或者由java.ext.dirs系統(tǒng)變量指定的路徑中的所有類庫(kù)(如javax.*開(kāi)頭的類),開(kāi)發(fā)者可以直接使用擴(kuò)展類加載器。

應(yīng)用程序類加載器:

Application ClassLoader,該類加載器由sun.misc.Launcher$AppClassLoader來(lái)實(shí)現(xiàn),它負(fù)責(zé)加載用戶類路徑(ClassPath)所指定的類,開(kāi)發(fā)者可以直接使用該類加載器,如果應(yīng)用程序中沒(méi)有自定義過(guò)自己的類加載器,一般情況下這個(gè)就是程序中默認(rèn)的類加載器。


6、類的加載方式

類加載有三種方式:

1、命令行啟動(dòng)應(yīng)用時(shí)候由JVM初始化加載

2、通過(guò)Class.forName()方法動(dòng)態(tài)加載

3、通過(guò)ClassLoader.loadClass()方法動(dòng)態(tài)加載

Class.forName()和ClassLoader.loadClass()區(qū)別?

  • Class.forName(): ?將類的.class文件加載到JVM中,還會(huì)對(duì)類進(jìn)行解釋,執(zhí)行類中的static塊
  • ClassLoader.loadClass(): ?只會(huì)將.class文件加載到JVM中,不會(huì)執(zhí)行static中的內(nèi)容,只有在newInstance() 方法創(chuàng)建類對(duì)象時(shí)才會(huì)去執(zhí)行static塊。
  • Class.forName(name, initialize, loader)帶參函數(shù)也可控制是否加載static塊。并且只有調(diào)用了newInstance()方法構(gòu)造函數(shù)創(chuàng)建類的對(duì)象時(shí)才會(huì)加載static塊 。

7、類的加載機(jī)制

  1. 緩存機(jī)制,緩存機(jī)制將會(huì)保證所有加載過(guò)的Class都會(huì)被緩存,當(dāng)程序中需要使用某個(gè)Class時(shí),類加載器先從緩存區(qū)尋找該Class,只有緩存區(qū)不存在,系統(tǒng)才會(huì)讀取該類對(duì)應(yīng)的二進(jìn)制數(shù)據(jù),并將其轉(zhuǎn)換成Class對(duì)象,存入緩存區(qū)。(修改了class后,需要重啟虛擬機(jī),程序的修改才會(huì)生效)
  2. 雙親委派機(jī)制, 如果一個(gè)類加載器收到了類加載的請(qǐng)求,首先不會(huì)自己去嘗試加載這個(gè)類,而是把請(qǐng)求委托給父加載器去完成,依次向上。因此,所有的類加載請(qǐng)求最終都應(yīng)該被傳遞到頂層的啟動(dòng)類加載器中,只有當(dāng)父加載器在它的搜索范圍中沒(méi)有找到所需的類時(shí),也就是無(wú)法完成該加載,子加載器才會(huì)嘗試自己去加載該類。

8、雙親委派機(jī)制

  1. 當(dāng)AppClassLoader加載一個(gè)class時(shí),它首先不會(huì)自己去嘗試加載這個(gè)類,而是把類加載請(qǐng)求委派給父類加載器ExtClassLoader去完成。

  2. 當(dāng)ExtClassLoader加載一個(gè)class時(shí),它首先也不會(huì)自己去嘗試加載這個(gè)類,而是把類加載請(qǐng)求委派給BootStrapClassLoader去完成。

  3. 如果BootStrapClassLoader加載失敗(例如在$JAVA_HOME/jre/lib里未查找到該class),會(huì)使用ExtClassLoader來(lái)嘗試加載;

  4. ExtClassLoader也加載失敗,則會(huì)使用AppClassLoader來(lái)加載,如果AppClassLoader也加載失敗,則會(huì)報(bào)出異常ClassNotFoundException。

雙親委派機(jī)制的好處:

  • 系統(tǒng)類防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼(比如自己寫的String類JDK中的String類會(huì)優(yōu)先使用JDK中的系統(tǒng)API)
  • 保證Java程序安全穩(wěn)定運(yùn)行
  • 解決了各個(gè)類加載器的基礎(chǔ)類統(tǒng)一問(wèn)題

9、破壞雙親委派機(jī)制

為什么要破壞雙親委派?

舉個(gè)🌰: 我們常用數(shù)據(jù)庫(kù)驅(qū)動(dòng)Driver接口,Driver定義在JDK中,但其實(shí)現(xiàn)是各個(gè)數(shù)據(jù)庫(kù)服務(wù)商,比如:MySQLMYSQL CONNECROR,因此DriverManger要加載各個(gè)Driver接口實(shí)現(xiàn)類進(jìn)行管理,但是DriverManager是由啟動(dòng)類加載器進(jìn)行加載的,而這個(gè)啟動(dòng)類加載器默認(rèn)值加載JDK安裝目錄下面的lib文件下的類庫(kù),但我們真正要加載的是各個(gè)實(shí)現(xiàn)類,需要有應(yīng)用程序類加載器進(jìn)行加載,這個(gè)時(shí)候就需要啟動(dòng)類加載器委托應(yīng)用程序類加載器去加載Driver實(shí)現(xiàn)類,從而破壞了雙親委派。

破壞方式:

  1. 自定義類加載,重寫loadclass方法。雙親委派的機(jī)制都是通過(guò)這個(gè)方法實(shí)現(xiàn)的,這個(gè)方法可以指定類通過(guò)什么類加載器來(lái)進(jìn)行加載,所以如果改寫他的加載規(guī)則,相當(dāng)于打破雙親委派機(jī)制。
  2. 線程上下文類加載器: 提供父類加載器訪問(wèn)子類加載器的行為。
    雙親委派很好的解決了各個(gè)類加載器的基礎(chǔ)類統(tǒng)一問(wèn)題,基礎(chǔ)類總是被用戶代碼所調(diào)用,但是如果基礎(chǔ)類又要重新調(diào)用用戶代碼,此時(shí)就與雙親委派模型的設(shè)計(jì)理念相違背。
    比如:JNDI服務(wù)(JDBC/JCE/JAXB/JBI)是Java的標(biāo)準(zhǔn)服務(wù),它的代碼是由啟動(dòng)類加載器進(jìn)行加載的,但是JNDI的作用就是進(jìn)行資源的集中管理和查找,它需要調(diào)用由(服務(wù)廠商提供的實(shí)現(xiàn)類)開(kāi)發(fā)人員在classpath下的類代碼,但是啟動(dòng)類加載器不會(huì)進(jìn)行加載。
    所以引入線程上下類加載器,通過(guò)java.lang.Thread類的setContextClassLoader()方法進(jìn)行設(shè)置。如果創(chuàng)建線程時(shí)還未設(shè)置,它會(huì)從父線程繼承一個(gè),如果在應(yīng)用程序全局范圍內(nèi)沒(méi)有設(shè)置,那么這個(gè)線程上下類加載器就是應(yīng)用程序類加載器。
  3. Java熱部署
    Java熱部署的規(guī)范化模塊是OSGi提供的,熱部署實(shí)現(xiàn)的關(guān)鍵就是OSGi自定義了類加載器,它為每個(gè)模塊都配了一個(gè)類加載器。當(dāng)需要?jiǎng)討B(tài)地更換一個(gè)模塊的時(shí)候,就把模塊連通這個(gè)模塊的類加載器一起替換,從而實(shí)現(xiàn)了熱替換。此時(shí)類加載器從樹(shù)狀結(jié)構(gòu)變?yōu)榱司W(wǎng)狀結(jié)構(gòu),有大量的層與層之間的類加載器,所以就打破了雙親委派模型。

參考文章:

  • https://pdai.tech/md/java/jvm/java-jvm-classload.html
  • https://blog.csdn.net/Wangxichuan_Jack/article/details/123711799
  • https://blog.csdn.net/Fqzzzzz/article/details/123989751
  • https://blog.csdn.net/weixin_45629285/article/details/128050932
http://www.risenshineclean.com/news/7781.html

相關(guān)文章:

  • 南寧做網(wǎng)站開(kāi)發(fā)的公司有哪些怎么寫網(wǎng)站
  • 韓國(guó)設(shè)計(jì)欣賞網(wǎng)站個(gè)人推廣網(wǎng)站
  • 棗莊專業(yè)做網(wǎng)站企業(yè)網(wǎng)站建設(shè)的目的
  • 網(wǎng)站內(nèi)容圖片怎么做windows7優(yōu)化大師
  • 南京做微網(wǎng)站蘇州seo關(guān)鍵詞優(yōu)化報(bào)價(jià)
  • 深圳b2b網(wǎng)站建設(shè)排名南寧seo優(yōu)勢(shì)
  • 做個(gè)門戶網(wǎng)站多少錢汕頭最好的seo外包
  • 網(wǎng)站建設(shè)用什么軟件鄭州官網(wǎng)網(wǎng)站推廣優(yōu)化公司
  • 網(wǎng)站門戶建設(shè)流程武漢最新疫情
  • 網(wǎng)站的產(chǎn)品中心怎么做國(guó)際新聞快報(bào)
  • 三明網(wǎng)站建設(shè)虛擬主機(jī)搭建網(wǎng)站
  • 做外貿(mào)生意最好的網(wǎng)站國(guó)外搜索引擎網(wǎng)站
  • 青島城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站西安網(wǎng)站seo廠家
  • 河間網(wǎng)站建設(shè)公司創(chuàng)建網(wǎng)站需要多少資金
  • 如何做網(wǎng)站的源碼23歲老牌網(wǎng)站
  • wordpress 留言板 插件seo排名查詢
  • 攝影網(wǎng)站 蜂鳥(niǎo)seo網(wǎng)址
  • 長(zhǎng)沙網(wǎng)站建設(shè)有限公司網(wǎng)絡(luò)推廣的概念
  • wap網(wǎng)站開(kāi)發(fā)實(shí)例seo程序
  • 怎么推廣平臺(tái)江北seo頁(yè)面優(yōu)化公司
  • 網(wǎng)站報(bào)價(jià)模板如何聯(lián)系百度人工客服電話
  • 合肥網(wǎng)站建設(shè)技術(shù)支持廣州權(quán)威發(fā)布
  • wordpress用戶名長(zhǎng)度河北網(wǎng)站seo外包
  • 上海網(wǎng)站開(kāi)發(fā)定制seox
  • 如何架設(shè)內(nèi)部網(wǎng)站太原seo霸屏
  • 文字圖片在線生成器谷歌seo怎么做
  • 如何測(cè)試網(wǎng)站的跨瀏覽器兼容性抖音搜索關(guān)鍵詞排名
  • 國(guó)外做動(dòng)運(yùn)服裝的網(wǎng)站襄陽(yáng)seo
  • 一個(gè)公司可以做兩個(gè)網(wǎng)站嗎新聞?lì)^條最新消息
  • 讓百度收錄自己的網(wǎng)站百度熱詞搜索指數(shù)