1.JVM組成部分:
????棧贷揽,本地方法棧,程序計數(shù)器梦碗,堆禽绪,方法區(qū)(元空間)。其中堆和方法區(qū)線程共享數(shù)據(jù)叉弦,而其他三個線程私有數(shù)據(jù)丐一。
2.JVM運行過程:
? ? 一個Java的class類通過類加載子系統(tǒng)進入JVM,將其代碼由上至下進行壓棧操作淹冰,通過先進后出來保證執(zhí)行順序一致库车。每運行一行代碼,程序計數(shù)器加1樱拴。其非java語言的代碼放入本地方法區(qū)柠衍。其運行過程中生成的類對象或數(shù)組,集合等對象放進堆中晶乔,通過先進先出來保證對象的正確性珍坊。其加載的類信息,常量正罢,靜態(tài)變量放入方法區(qū)保存阵漏。
3.棧運行過程:
????main方法中有變量a等于add方法返回值,add的方法里寫的是變量a=1,b=1,c=a+b,再返回c??
這行代碼在棧中的運行過程如下:
? ?(1). 先將main方法進行壓棧形成一個main棧幀,再將add方法也進行壓棧形成add棧幀履怯。
????(2).將add方法中的變量a壓入add棧幀的局部變量表中回还,數(shù)值1壓入add棧幀的操作數(shù)棧中,等號賦值時將數(shù)值1出棧寫進變量a指向的地址中叹洲。變量b類似變量a的操作柠硕。
????(3).變量c時將其變量c壓入add棧幀的局部變量表中,再從變量a和變量b取到數(shù)值1和數(shù)值2壓棧進入add棧幀的操作數(shù)棧中运提,做加法運算符時將數(shù)值1和數(shù)值2出棧算出數(shù)值3蝗柔,再將數(shù)值3壓棧進入add棧幀的操作數(shù)棧中,等于賦值時數(shù)值3出棧寫進變量c指向地址民泵。?
? ? (4). 返回c是通過add棧幀的方法出口找到main棧幀的的局部變量表中的變量a癣丧,再將其數(shù)值3寫進對應的地址中。
如果變量賦值的不是基本類型洪灯,而是對象時坎缭,變量還是放在棧幀的局部變量表中,但是對象就放在堆中签钩,將其變量指向堆中的對象掏呼。
4.程序計數(shù)器:指向當前線程所執(zhí)行的字節(jié)碼指令的(地址)行號.
5.本地方法棧:添加native關(guān)鍵字修飾的方法放進其中,一般是用來執(zhí)行C,C++等其他語言的代碼铅檩。
6.方法區(qū)(元空間):類的模板屬性如常量憎夷,成員變量等類信息。
7.堆的組成部分:分為新生代和老年代昧旨,比例一般為1:2拾给。其中新生代中一般有伊甸園區(qū)和S1和S2,比例一般為8:1:1兔沃。對象一般是在伊甸園中產(chǎn)生蒋得,也有特殊對象直接進入老年代。
8.堆的回收機制:
? ? (1).minor gc:當伊甸園區(qū)的內(nèi)存被對象占滿時觸發(fā)乒疏,通過對象引用數(shù)是不是為0來判斷游離狀態(tài)额衙,如果是清除該對象,不是將其放入S1中怕吴。從而將伊甸園區(qū)請空窍侧。每次伊甸園區(qū)的minor gc觸發(fā)時,S1中的對象引用數(shù)為0時也會清除转绷,不為0時這個對象的存在次數(shù)會加1伟件。如果存在次數(shù)大于15時,會將這個對象存入老年代的內(nèi)存中议经。當運行到S1的內(nèi)存被占滿時斧账,將其所有對象拷貝進S2并存在次數(shù)加1谴返,本身內(nèi)存中的對象全部清空。然后minor gc觸發(fā)時其骄,將其引用數(shù)不為0的對象放進S2亏镰,S2內(nèi)存滿后將其所有對象拷貝進S1,使S1和S2的內(nèi)存來回利用拯爽。
? ? (2).full gc:當老年代的內(nèi)存被占滿時會報內(nèi)存溢出的錯誤導致程序服務失敗。
? ??
? ??