柚子快報(bào)激活碼778899分享:JVM-1
柚子快報(bào)激活碼778899分享:JVM-1
目錄
1.基礎(chǔ)知識
1.棧
2.本地方法棧
3.程序計(jì)數(shù)器
4.堆
5.方法區(qū)
6.JVM內(nèi)存可見性
2.虛擬機(jī)類加載機(jī)制
1.加載
2.驗(yàn)證
3.準(zhǔn)備
4.解析
5.初始化
6.使用
7.卸載
1.基礎(chǔ)知識
JVM內(nèi)存模型(5種):棧,本地方法棧,程序計(jì)數(shù)器,堆,方法區(qū)。
1.棧
又稱方法棧,線程私有的,線程執(zhí)行方法是都會創(chuàng)建一個(gè)棧陣,用來存儲局部變量表,操作棧,動(dòng)態(tài)鏈接,方法出口等信息
調(diào)用方法時(shí)執(zhí)行入棧,方法返回時(shí)執(zhí)行出棧。
2.本地方法棧
與棧類似,也是用來保存執(zhí)行方法的信息.
執(zhí)行Java方法是使用棧,執(zhí)行Native方法時(shí)使用本地方法棧
3.程序計(jì)數(shù)器
保存著當(dāng)前線程執(zhí)行的字節(jié)碼位置,每個(gè)線程工作時(shí)都有獨(dú)立的計(jì)數(shù)器,只為執(zhí)行Java方法服務(wù),執(zhí)行
Native方法時(shí),程序計(jì)數(shù)器為空
4.堆
JVM內(nèi)存管理最大的一塊,被線程共享,目的是存放對象的實(shí)例,幾乎所有的對象實(shí)例都會放在這里,
當(dāng)堆沒有可用空間時(shí),會拋出OOM異常(內(nèi)存溢出,Out Of Memory,簡稱OOM)。
根據(jù)對象的存活周期不同,JVM把對象進(jìn)行分代管理,由垃圾回收器進(jìn)行垃圾的回收管理
5.方法區(qū)
又稱非堆區(qū),用于存儲已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量,即時(shí)編譯器優(yōu)化后的代碼等數(shù)據(jù)。
6.JVM內(nèi)存可見性
JMM(Java內(nèi)存模型Java Memory Model)本身是一種抽象的概念并不真實(shí)存在,它僅僅描述的是一組約定或規(guī)范,通過這組規(guī)范定義了程序中(尤其是多線程)各個(gè)變量的讀寫訪問方式并決定一個(gè)線程對共享變量的寫入以及如何變成對另一個(gè)線程可見,關(guān)鍵技術(shù)點(diǎn)都是圍繞多線程的原子性、可見性和有序性展開的。
JMM定義程序中變量的訪問規(guī)則,線程對于變量的操作只能在自己的工作內(nèi)存中進(jìn)行,而不能直接對主內(nèi)存進(jìn)行操作。
2.虛擬機(jī)類加載機(jī)制
從類被加載到虛擬機(jī)內(nèi)存中開始,到釋放內(nèi)存總共有7個(gè)步驟:加載(Loading)、驗(yàn)證(Verification)、準(zhǔn)備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、 卸載(Unloading)。其中驗(yàn)證,準(zhǔn)備,解析三個(gè)部分統(tǒng)稱為連接。
1.加載
通過類的完全限定名,查找此類字節(jié)碼文件,利用字節(jié)碼文件創(chuàng)建Class對象
通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流將這個(gè)字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)在Java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對象,作為方法區(qū)這些數(shù)據(jù)的訪問入口
2.驗(yàn)證
確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身安全
文件格式驗(yàn)證元數(shù)據(jù)驗(yàn)證字節(jié)碼驗(yàn)證符號引用驗(yàn)證
3.準(zhǔn)備
進(jìn)行內(nèi)存分配,為static修飾的類變量分配內(nèi)存,并設(shè)置初始值(0或null).不包含final修飾的靜態(tài)變量,因?yàn)閒inal變量在編譯時(shí)分配.
4.解析
將常量池中的符號引用替換為直接引用的過程.
符號引用(Symbolic References): 符號引用以一組符號來描述所引用的目標(biāo),符號可以使任何形式的字面量,只要使用時(shí)能無歧義地定位到目標(biāo)即可。符號引用于虛擬機(jī)實(shí)現(xiàn)的內(nèi)存布局無關(guān),引用的目標(biāo)不一定已經(jīng)加載到內(nèi)存中。
直接引用(Direct References):直接引用可以是直接指向目標(biāo)的指針,相對偏移量或是一個(gè)能簡介定位到目標(biāo)的句柄,直接引用是與虛擬機(jī)實(shí)現(xiàn)的內(nèi)存布局相關(guān)的,統(tǒng)一符號引用在不同虛擬機(jī)實(shí)例上翻譯出來的直接引用一般不會相同,如果有了直接引用,那引用的目標(biāo)必定已經(jīng)在內(nèi)存中存在。
5.初始化
主要完成靜態(tài)塊執(zhí)行以及靜態(tài)變量的賦值.先初始化父類,再初始化當(dāng)前類.只有對類主動(dòng)使用時(shí)才會初始化
6.使用
7.卸載
?
總結(jié):這幾天額要寫JVM專欄啦!
柚子快報(bào)激活碼778899分享:JVM-1
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。