Java內(nèi)存區(qū)域:
1:程序計(jì)數(shù)器:java虛擬機(jī)是通過(guò)多線程輪流切換并分配處理器執(zhí)行時(shí)間方式來(lái)實(shí)現(xiàn)的,在任何一個(gè)確定的時(shí)間內(nèi),一個(gè)處理器都只會(huì)執(zhí)行一條線程上的指令,因此,為了使線程切換后能恢復(fù)到一個(gè)正確的執(zhí)行位置褒繁,每條線程都會(huì)有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各條線程之間互相不影響馍忽,獨(dú)立存儲(chǔ)這類內(nèi)存區(qū)域就是線程所獨(dú)有的內(nèi)存
2:java虛擬機(jī)棧:方法執(zhí)行的時(shí)候所建立的一個(gè)棧棒坏,存儲(chǔ)了局部變量以及操作數(shù),動(dòng)態(tài)鏈接遭笋,
3:java堆:大多數(shù)應(yīng)用坝冕,java堆可以是連續(xù)的也可以是不連續(xù)的,保存了對(duì)象地址瓦呼。
4:方法區(qū):和堆一樣喂窟,也是各個(gè)線程所共享,用來(lái)存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息央串,常量磨澡,靜態(tài)變量等等。(Non-Heap)质和。
類加載:
1:類加載的場(chǎng)景
a:當(dāng)遇到new關(guān)鍵字的時(shí)候稳摄,如果類沒(méi)有初始化,就會(huì)觸發(fā)其初始化
b:當(dāng)使用java反射包對(duì)類進(jìn)行反射調(diào)用的時(shí)候饲宿,
c:當(dāng)初始化一個(gè)類的時(shí)候厦酬,如果發(fā)現(xiàn)他的父類沒(méi)有初始化,那么就會(huì)觸發(fā)其父類的初始化
d:當(dāng)虛擬機(jī)啟動(dòng)的過(guò)程中瘫想,需要指定一個(gè)程序的入口弃锐,也就是main函數(shù)的時(shí)候,虛擬機(jī)就會(huì)先初始化這個(gè)類殿托。
類的加載過(guò)程:
1:加載? 2:驗(yàn)證? 準(zhǔn)備,解析? 3:初始化? 4:使用5:卸載
1:通過(guò)一個(gè)類的全名來(lái)獲取這個(gè)類的二進(jìn)制字節(jié)流
2:將這個(gè)類所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)
3:在內(nèi)存中生成這個(gè)類的Class對(duì)象剧蚣。作為方法區(qū)的這個(gè)類的各種數(shù)據(jù)入口
2:驗(yàn)證
驗(yàn)證階段支竹,就是判斷字節(jié)流是否符合Class文件的規(guī)范旋廷,同時(shí)還根據(jù)靜態(tài)代碼的執(zhí)行順序,賦初始值
3:初始化
再次根據(jù)程序啟動(dòng)來(lái)賦值
對(duì)象的加載過(guò)程:
?JVM遇到new關(guān)鍵字礼搁,會(huì)自動(dòng)去堆內(nèi)存中開(kāi)辟存儲(chǔ)空間饶碘,根據(jù)類的表述,會(huì)對(duì)非靜態(tài)成員變量分配下變量空間馒吴,同時(shí)還會(huì)對(duì)非靜態(tài)成員設(shè)置默認(rèn)值扎运,然后會(huì)調(diào)用構(gòu)造函數(shù)進(jìn)棧。執(zhí)行構(gòu)造函數(shù)之前饮戳,會(huì)先去看看是否有父類豪治,執(zhí)行下Super。然后會(huì)去執(zhí)行構(gòu)造代碼塊{ }扯罐。接著給對(duì)象中的函數(shù)賦顯示值负拟。然后執(zhí)行構(gòu)造函數(shù),最后才是出棧歹河。
雙親委派模型:如果一個(gè)類加載器收到了類加載的請(qǐng)求掩浙,它首先不會(huì)自己去嘗試加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類加載器去完成秸歧,每一個(gè)層次的加載器都是如此厨姚,因此所有的加載請(qǐng)求最終都會(huì)傳送到頂層的啟動(dòng)類加載器中,只有當(dāng)父加載器反饋?zhàn)约簾o(wú)法完成這個(gè)請(qǐng)求時(shí)键菱,子加載器才會(huì)去進(jìn)行自己嘗試加載谬墙。簡(jiǎn)潔點(diǎn)就是:越是基礎(chǔ)的類,就會(huì)被越上級(jí)的加載器所進(jìn)行加載纱耻。
好處是:java類隨著它的類加載器一起具備了一種層級(jí)關(guān)系芭梯,例如Object類,無(wú)論那一個(gè)類加載這個(gè)類弄喘,最終都是委托給處于模型最頂端的類來(lái)加載玖喘,因此Object類在所有的類加載器都是同一個(gè)類。
如果不是這樣蘑志,那么可以自己建立一個(gè)Object類累奈,然后自己去加載,這樣java類體系就會(huì)出現(xiàn)混亂急但。