Java虛擬機在執(zhí)行java程序過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域
?
1. 程序計數(shù)器
a) 是一塊較小的內(nèi)存,它的作用可以看做是當前線程所執(zhí)行的字節(jié)碼的行號指示器。在虛擬機的概念模型里,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令、分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個計數(shù)器來完成
b) 由于java虛擬機的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現(xiàn)的,在任何一個確定的時刻,一個處理器(對于多核處理器來說是一個內(nèi)核)只會執(zhí)行一條線程中的指令,因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個獨立的程序計數(shù)器,各條線程之間的計數(shù)器互不影響,獨立存儲,我們稱這類內(nèi)存區(qū)域為“線程私有”的內(nèi)存
2. Java虛擬機棧
a) 用戶存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息,每一個方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機中從入棧到出棧的過程
b) 局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型(boolean、type、char、short,int、float、long、double),對象引用(reference類型)和returnAddress類型(指向了一條字節(jié)碼指令的地址)
c) 在這個區(qū)域中會出現(xiàn)兩種異常:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常,如果虛擬機棧可以動態(tài)擴展,當擴展時無法申請到足夠的內(nèi)存空間時會拋出OutOfMemoryError異常
3. Java堆
a) 此內(nèi)存區(qū)域唯一的目的就是存放對象實例,幾乎所有的對象實例都在這里分配內(nèi)存
b) 當前主流的虛擬機都是可過擴展來規(guī)定此區(qū)域所分配的最大內(nèi)存空間(通過-Xmx和-Xms控制),如果在堆中沒有內(nèi)存完成實例分配,并且堆也無法再擴展時,將會拋出OutOfMemoryError異常
4. 方法區(qū)
a) 存放加載的類信息、常量、靜態(tài)變量
實戰(zhàn):OutOfMemoryError異常
1. java堆溢出
?
運行結(jié)果:java.lang.OutOfMemoryError:java heap space
2. java棧溢出
?
運行結(jié)果:java.lang.StackOverflowError
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
