摘要:只有當(dāng)父加載器無法完成加載的時(shí)候,子加載器才會(huì)嘗試自己加載。破壞雙親委托機(jī)制實(shí)現(xiàn)熱部署
類加載器:
負(fù)責(zé)將生成的.class文件加載到內(nèi)存中,并生成對(duì)應(yīng)的Class對(duì)象 三種類加載器: BootStrapClassLoader:引導(dǎo)類加載器,負(fù)責(zé)java核心類的加載 ExtensionClassLoader: 擴(kuò)展類加載器 AppClassLoader:應(yīng)用類加載器 負(fù)責(zé)加載我們寫的一些類
類加載概述:
當(dāng)程序要使用某個(gè)類的時(shí)候,如果該類還沒有被加載到內(nèi)存中, 系統(tǒng)會(huì)通過加載、連接和初始化三步來實(shí)現(xiàn)對(duì)該類的初始化。 加載:將class文件中的二進(jìn)制數(shù)據(jù)數(shù)據(jù)讀入到內(nèi)存中, 然后將該字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)中運(yùn)行的數(shù)據(jù)結(jié)構(gòu), 最終創(chuàng)建一個(gè)Class對(duì)象,任何類使用時(shí)系統(tǒng)都會(huì)創(chuàng)建該類的Class對(duì)象 連接: 驗(yàn)證:確保class文件中字節(jié)流包含的信息符合當(dāng)前虛擬機(jī)的要求 文件格式的驗(yàn)證:驗(yàn)證是否符合Class文件格式的規(guī)范 元數(shù)據(jù)的驗(yàn)證:對(duì)字節(jié)碼描述的信息進(jìn)行語法校驗(yàn) 字節(jié)碼驗(yàn)證:驗(yàn)證程序的控制流程 符號(hào)引用驗(yàn)證:發(fā)生在虛擬機(jī)將二進(jìn)制符號(hào)轉(zhuǎn)換為直接引用的時(shí)候 準(zhǔn)備:為類變量分配內(nèi)存并設(shè)置初始值。這些變量使用的內(nèi)存都在方法區(qū)中分配。 這時(shí)候分配的內(nèi)存僅包括類變量(靜態(tài)變量),實(shí)例變量會(huì)在對(duì)象實(shí)例化的時(shí)候 隨著對(duì)象一起分配在堆內(nèi)存中 解析:將二進(jìn)制符號(hào)的引用替換為直接引用 初始化:父類靜態(tài)(靜態(tài)的成員變量,靜態(tài)代碼塊), 子類靜態(tài)(子類靜態(tài)成員變量,子類的靜態(tài)代碼塊) 父類非靜態(tài)(非靜態(tài)成員變量,構(gòu)造代碼塊,構(gòu)造函數(shù)) 子類非靜態(tài)(子類非靜態(tài)成員變量,子類構(gòu)造代碼塊,子類構(gòu)造函數(shù))
靜態(tài)語句塊只能訪問定義到靜態(tài)語句塊之前的變量,定義在之后的變量,只能夠賦值,不能夠訪問
static{ num = 100; System.out.println(num);//編譯不通過 } private static int num = 10;
類加載器的加載機(jī)制:
雙親委托機(jī)制 當(dāng)一個(gè)類加載器調(diào)用loadClass之后,并不會(huì)直接加載, 而是先交給當(dāng)前類加載器的父加載器加載,直到最頂層的父加載器。 只有當(dāng)父加載器無法完成加載的時(shí)候,子加載器才會(huì)嘗試自己加載。 破壞雙親委托機(jī)制:實(shí)現(xiàn)熱部署
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70360.html
摘要:本文承接上一篇樂字節(jié)發(fā)射之二實(shí)例化對(duì)象接口與父類修飾符和屬性繼續(xù)講述反射之三方法數(shù)組類加載器一方法獲取所有方法包括父類或接口,使用即可。當(dāng)沒有任何引用指向?qū)ο髸r(shí)就會(huì)被卸載,結(jié)束類的生命周期。 本文承接上一篇:樂字節(jié)Java發(fā)射之二:實(shí)例化對(duì)象、接口與父類、修飾符和屬性 繼續(xù)講述Java反射之三:方法、數(shù)組、類加載器 一、方法 獲取所有方法(包括父類或接口),使用Method即可。sho...
摘要:在加載階段,虛擬機(jī)要完成件事情通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。前面的階段中,除了加載的時(shí)候,可以由用戶指定自定義類加載器之外,別的都是由虛擬機(jī)主導(dǎo)控制。 java類加載機(jī)制 代碼編譯的結(jié)果從本地機(jī)器碼轉(zhuǎn)變?yōu)樽止?jié)碼,是存儲(chǔ)格式發(fā)展的一小步,確實(shí)編程語言發(fā)展的一大步 虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直...
摘要:當(dāng)程序使用某個(gè)類時(shí),如果該類還沒被初始化,加載到內(nèi)存中,則系統(tǒng)會(huì)通過加載連接初始化三個(gè)過程來對(duì)該類進(jìn)行初始化。一旦一個(gè)類被加載到中之后,就不會(huì)再次載入了。它既可以從本地文件系統(tǒng)獲取二進(jìn)制文件來加載類,也可以遠(yuǎn)程主機(jī)獲取二進(jìn)制文件來加載類。 當(dāng)程序使用某個(gè)類時(shí),如果該類還沒被初始化,加載到內(nèi)存中,則系統(tǒng)會(huì)通過加載、連接、初始化三個(gè)過程來對(duì)該類進(jìn)行初始化。該過程就被稱為類的初始化 類加載 ...
摘要:新生代又被劃分為三個(gè)區(qū)域和兩個(gè)幸存區(qū)。這樣劃分的目的是為了使能夠更好地管理堆內(nèi)存中的對(duì)象,包括內(nèi)存的分配及回收。新生代主要存儲(chǔ)新創(chuàng)建的對(duì)象和尚未進(jìn)入老年代的對(duì)象。 在Java中主要有以下三種類加載器: 引導(dǎo)類加載器(bootstrap class loader) --用來加載java的核心庫(Strin...
摘要:加載階段在類的加載階段,虛擬機(jī)需要完成以下件事情通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。驗(yàn)證階段驗(yàn)證是連接階段的第一步,這一階段的目的是為了確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。 注:本篇文章中的內(nèi)容是根據(jù)《深入理解Java虛擬機(jī)--JVM高級(jí)特性與最佳實(shí)踐》而總結(jié)的,如有理解錯(cuò)誤,歡迎大家指正! 虛擬機(jī)把描述類的數(shù)據(jù)從Class文件...
閱讀 792·2021-09-22 16:01
閱讀 2084·2021-08-20 09:37
閱讀 1693·2019-08-30 15:54
閱讀 1689·2019-08-30 15:44
閱讀 826·2019-08-28 18:23
閱讀 3005·2019-08-26 12:17
閱讀 1005·2019-08-26 11:56
閱讀 1539·2019-08-23 16:20