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