首先會(huì)把java編譯成為字節(jié)碼。然后通過(guò)類加載器加載字節(jié)碼。
JVM加載 雙親委任模型:
java在加載一個(gè)類的時(shí)候,會(huì)首先判斷是否這個(gè)類已經(jīng)被加載了,如果被加載了就會(huì)直接返回,如果沒(méi)有被加載,則會(huì)使用一個(gè)互斥鎖,開(kāi)始對(duì)類進(jìn)行加載,在加載的時(shí)候,會(huì)遞歸的調(diào)用parent.loadclass 就是一直到最后上層(boostraploader)看最上層能不能夠加載該類,如果最上層能夠加載,那么這一層的加載器就不會(huì)加載類,如果上層加載器不能加載,上層會(huì)拋出異常,這樣這一層才會(huì)使用自己的加載方法,這樣的一個(gè)好處就是,例如我們?cè)谌绻麑?xiě)了一個(gè)本地list類,就不會(huì)被成功加載,因?yàn)樯蠈蛹虞d器已經(jīng)加載了一個(gè)同樣名稱的類,這樣就會(huì)報(bào)錯(cuò),這樣的好處就是,我們可以實(shí)現(xiàn)類加載的安全性隔離。(類加載器只會(huì)加載指定路徑下的類,所以如果我們想加載一個(gè)和系統(tǒng)類同名的類,我們可以自己寫(xiě)一個(gè)類加載器,并且把需要加載的類放到別的路徑當(dāng)中)

JVM的組成
虛擬機(jī)棧:
本地方法棧:包含八大基礎(chǔ)類型和一個(gè)引用類型
堆:用于存放new出來(lái)的對(duì)象
方法區(qū):類信息(一個(gè)類的名字及類中包含的方法) 常量(final) 靜態(tài)變量(static) JIT編譯后的代碼(經(jīng)常使用的代碼,類似于緩存熱點(diǎn)代碼)
程序計(jì)數(shù)器:


