Java培訓(xùn)班教程系列分享JVM模型的介紹一,Java內(nèi)存分配:JVM定義了若干個(gè)程序執(zhí)行期間使用的數(shù)據(jù)區(qū)域。這個(gè)區(qū)域里的一些數(shù)據(jù)在JVM啟動(dòng)的時(shí)候創(chuàng)建,在JVM退出的時(shí)候銷(xiāo)毀。而其他的數(shù)據(jù)依賴(lài)于每一個(gè)線程,在線程創(chuàng)建時(shí)創(chuàng)建,在線程退出時(shí)銷(xiāo)毀。
Java按照內(nèi)存使用區(qū)域可以分為四個(gè)部分:堆、棧、方法區(qū)和程序計(jì)數(shù)器;其中棧又可以分為兩大部分:Java虛擬機(jī)棧和本地方法棧;下面我將通過(guò)自己的學(xué)習(xí)與別人總結(jié)的參考見(jiàn)解來(lái)介紹下jvm
圖片1
程序計(jì)數(shù)器
程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,它被用來(lái)記錄當(dāng)前指令執(zhí)行程序的位置,在內(nèi)部通過(guò)改變計(jì)數(shù)器的位置來(lái)確定下一條指令執(zhí)行程序的位置;
我們知道Java多線程的實(shí)質(zhì)是通過(guò)線程輪流切換并分配處理執(zhí)行事件來(lái)實(shí)現(xiàn)的,而在任何一個(gè)確定的時(shí)刻,一個(gè)處理器只會(huì)執(zhí)行一個(gè)線程中的一條指令。為了能讓線程切換后仍然能恢復(fù)到原來(lái)的位置,每個(gè)線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,他們之間互不影響,所以,程序計(jì)數(shù)器是線程私有的內(nèi)存區(qū)域
如果一個(gè)線程正在執(zhí)行一個(gè)Java方法,那么程序計(jì)數(shù)器記錄的就是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行一個(gè)native方法,那么程序計(jì)數(shù)器的值就為空;
程序計(jì)數(shù)器是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError情況的區(qū)域,在四個(gè)區(qū)域中只有它不會(huì)出現(xiàn)內(nèi)存溢出的情況
棧之Java虛擬機(jī)棧
Java虛擬機(jī)棧描述的是Java方法的內(nèi)存模型;每個(gè)方法在被執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)Java虛擬機(jī)棧(棧幀),用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接和方法出口等信息,因此Java虛擬機(jī)棧也是線程私有的;
類(lèi)似于動(dòng)畫(huà)是由一棧一棧的棧幀切換產(chǎn)生的,程序的執(zhí)行也是由棧幀的切換產(chǎn)生的,只是這些棧幀中存放的是方法的局部變量、操作棧、動(dòng)態(tài)鏈接和方法出口等信息;每一個(gè)方法被調(diào)用直至執(zhí)行完成的過(guò)程,就是一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過(guò)程;
對(duì)于執(zhí)行引擎來(lái)說(shuō),只有棧頂?shù)臈怯行У模Q(chēng)為當(dāng)前棧幀,這個(gè)棧幀關(guān)聯(lián)的方法稱(chēng)為當(dāng)前方法,執(zhí)行引擎所有的字節(jié)碼指令都值針對(duì)當(dāng)前棧幀進(jìn)行操作;
通常我們所說(shuō)的變量存儲(chǔ)在棧中是不嚴(yán)謹(jǐn)?shù)模?font face="Calibri">Java虛擬機(jī)棧中存放的是對(duì)應(yīng)方法的局部變量,而且這些局部變量存放在Java虛擬機(jī)中的局部變量表中;對(duì)于保存的局部變量分類(lèi):Java中的基本數(shù)據(jù)類(lèi)型變量的值存放在局部變量表,而對(duì)于引用類(lèi)型變量來(lái)說(shuō),局部變量表只會(huì)存放對(duì)象的引用,真正的值存放在堆中;
Java虛擬機(jī)是使用局部變量表來(lái)完成參數(shù)值到參數(shù)變量表的傳遞過(guò)程的,系統(tǒng)不會(huì)為局部變量賦予初始值(對(duì)于實(shí)例變量和類(lèi)變量都會(huì)賦予初始值)
在Java虛擬機(jī)規(guī)范中,對(duì)Java虛擬機(jī)棧規(guī)定了兩種異常情況:如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError 異常;如果虛擬機(jī)棧動(dòng)態(tài)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存時(shí),會(huì)拋出OutOfMemoryError 異常
以上就是小編介紹的"Java培訓(xùn)班分享的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn)還可以點(diǎn)擊進(jìn)入Java視頻教程進(jìn)行學(xué)習(xí)。
Java培訓(xùn)班:http://Java.qfedu.com/