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