生活随笔
收集整理的這篇文章主要介紹了
java JVM
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
每一個(gè)Java虛擬機(jī)都由一個(gè)類加載器子系統(tǒng)(class loader subsystem),負(fù)責(zé)加載程序中的類型(類和接口),并賦予唯一的名字。每一個(gè)Java虛擬機(jī)都有一個(gè)執(zhí)行引擎(execution engine)負(fù)責(zé)執(zhí)行被加載類中包含的指令。 數(shù)據(jù)區(qū)中的一部分是整個(gè)程序共有,其他部分被單獨(dú)的線程控制。每一個(gè)Java虛擬機(jī)都包含方法區(qū)(method area)和堆(heap),他們都被整個(gè)程序共享。Java虛擬機(jī)加載并解析一個(gè)類以后,將從類文件中解析出來的信息保存與方法區(qū)中。程序執(zhí)行時(shí)創(chuàng)建的 對象都保存在堆中。 Java虛擬機(jī)中的類加載器分為兩種:原始類加載器(primordial class loader)和類加載器對象(class loader objects)。原始類加載器是Java虛擬機(jī)實(shí)現(xiàn)的一部分,類加載器對象是運(yùn)行中的程序的一部分。不同類加載器加載的類被不同的命名空間所分割。 像其他對象一樣,類加載器對象和Class對象都保存在堆中,被加載的信息被保存在方法區(qū)中。1、加載、連接、初始化(Loading, Linking and Initialization)
類加載子系統(tǒng)不僅僅負(fù)責(zé)定位并加載類文件,他按照以下嚴(yán)格的步驟作了很多其他的事情:1)、加載:尋找并導(dǎo)入指定類型(類和接口)的二進(jìn)制信息2)、連接:進(jìn)行驗(yàn)證、準(zhǔn)備和解析①驗(yàn)證:確保導(dǎo)入類型的正確性②準(zhǔn)備:為類型分配內(nèi)存并初始化為默認(rèn)值③解析:將字符引用解析為直接飲用3)、初始化:調(diào)用Java代碼,初始化類變量為合適的值
此圖看出jvm內(nèi)存結(jié)構(gòu)
JVM內(nèi)存結(jié)構(gòu)主要包括兩個(gè)子系統(tǒng)和兩個(gè)組件。兩個(gè)子系統(tǒng)分別是Classloader子系統(tǒng)和Executionengine(執(zhí)行引擎)子系統(tǒng);兩個(gè)組件分別是Runtimedataarea(運(yùn)行時(shí)數(shù)據(jù)區(qū)域)組件和Nativeinterface(本地接口)組件。
類加載機(jī)制
JVM的類加載是通過ClassLoader及其子類來完成的,類的層次關(guān)系和加載順序可以由下圖來描述:
?
?
雙親委派模型的工作過程?
1、當(dāng)前 ClassLoader 首先從自己已經(jīng)加載的類中,查詢是否此類已經(jīng)加載,如果已經(jīng)加載則直接返回原來已經(jīng)加載的類。? ? 一定程度上防止自有的類被篡改
每個(gè)類加載器都有自己的加載緩存,當(dāng)一個(gè)類被加載了以后就會(huì)放入緩存,等下次加載的時(shí)候就可以直接返回了。
2、當(dāng)前 ClassLoader 的緩存中沒有找到被加載的類的時(shí)候
委托父類加載器去加載,父類加載器采用同樣的策略,首先查看自己的緩存,然后委托父類的父類去加載,一直到 bootstrap ClassLoader。
當(dāng)所有的父類加載器都沒有加載的時(shí)候,再由當(dāng)前的類加載器加載,并將其放入它自己的緩存中,以便下次有加載請求的時(shí)候直接返回。
?
轉(zhuǎn)載于:https://www.cnblogs.com/upward/p/11295125.html
總結(jié)
以上是生活随笔為你收集整理的java JVM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。