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

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