jvm加載類的順序 JVM為什么要3個(gè)類加載器?
JVM為什么要3個(gè)類加載器?JVM有三種加載程序:bootstrap負(fù)責(zé)加載系統(tǒng)類,extclassloader負(fù)責(zé)加載擴(kuò)展類,appclassloader負(fù)責(zé)加載應(yīng)用程序類。他們主要負(fù)責(zé)不同領(lǐng)域的工
JVM為什么要3個(gè)類加載器?
JVM有三種加載程序:bootstrap負(fù)責(zé)加載系統(tǒng)類,extclassloader負(fù)責(zé)加載擴(kuò)展類,appclassloader負(fù)責(zé)加載應(yīng)用程序類。他們主要負(fù)責(zé)不同領(lǐng)域的工作,同時(shí)也負(fù)責(zé)授權(quán)模式的實(shí)施。什么是授權(quán)模式?實(shí)際上,當(dāng)類裝入器需要裝入時(shí),它首先要求其父類使用父類的搜索路徑進(jìn)行聯(lián)接。如果找不到,它將使用自己的搜索路徑來搜索類。
執(zhí)行Java*時(shí)。班級(jí),java.exe文件將幫助我們找到JRE,然后找到j(luò)vm.dll這是真正的Java虛擬機(jī)。最后,加載動(dòng)態(tài)庫并激活Java虛擬機(jī)。在虛擬機(jī)被激活之后,它將執(zhí)行一些初始化操作,例如讀取系統(tǒng)參數(shù)。初始化完成后,將生成第一個(gè)類裝入器——引導(dǎo)裝入器。Bootstrap loader是由C語言編寫的,在Bootstrap loader的初始工作中,除了一些基本的初始化操作外,最重要的是加載啟動(dòng)器.java并將其父加載程序設(shè)置為null,這意味著父加載程序是引導(dǎo)加載程序。然后引導(dǎo)加載程序要求再次加載啟動(dòng)器.java并將其父級(jí)設(shè)置為之前生成的extclassloader實(shí)體。這兩個(gè)加載程序都以靜態(tài)類的形式存在。需要注意的是,launcher$ExtClassLoader.class類帶啟動(dòng)器$AppClassLoader.class類它們都是由引導(dǎo)加載程序加載的,所以父級(jí)與要加載的類加載程序無關(guān)。
jvm:java代碼是如何運(yùn)行的?
一個(gè)java項(xiàng)目包含許多帶有“.”的源代碼文件。Java“后綴。除了直接在IDE中調(diào)試外,一般來說,代碼類型是jar包或war包,最后打包的jar包或war包被發(fā)送到在線服務(wù)器進(jìn)行部署。
部署的方法有很多,最基本的方法是通過Tomcat容器進(jìn)行部署,也可以通過Java命令手動(dòng)運(yùn)行jar包中的代碼。
。
在Java代碼打包過程中,源代碼通常被編譯成一個(gè)字節(jié)碼文件,并帶有“?!邦悺焙缶Y。JVM只能識(shí)別和解釋字節(jié)碼文件類。
對于已編譯的類字節(jié)碼,您需要使用諸如Java-jar之類的命令來運(yùn)行已編寫的代碼;一旦使用Java命令,此時(shí)您將實(shí)際啟動(dòng)JVM進(jìn)程。
JVM進(jìn)程將負(fù)責(zé)運(yùn)行這些類字節(jié)碼文件,這相當(dāng)于運(yùn)行我們編寫的代碼。
要運(yùn)行這些類字節(jié)碼文件中的代碼,JVM將使用類加載器將編譯后的類字節(jié)碼文件加載到JVM的內(nèi)存中
執(zhí)行加載到內(nèi)存中的類。當(dāng)JVM需要哪個(gè)類時(shí),它將使用類加載器來加載相應(yīng)的類。