JAVA內存區域與內存溢出異常

1.運行時數據區:

程序計數器:
    作用:可以看做是當前線程所執行的字節碼的行號指示器。字節碼工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支,循環,跳轉,異常處理,線程恢復等基礎的功能都需要依賴這個計數器來完成
 JAVA虛擬機的多線程是通過線程輪流切換並分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對於多核處理器來說是一個內存)只會執行一條線程中的指令。爲了線程切換後能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間扥計數器相互不影響,獨立存儲,這個類內存區域”線程私有“的內存。
虛擬機棧:
    虛擬機棧:(局部變量表)存放了編譯器可知的各種各種數據類型(Boolean,byte,char,short,int,float,long,double),對象引用(reference類型,它不等同與對象本身,根據不同的虛擬機棧實現,它可能是一個指向對象起始地址的引用指針,也可能指向一個代表對象的句柄或者其他與此對象相關的位置)和returnAddress類型(指向了一條字節碼指定的地址)
    在JAVA虛擬機規範中,對於這個區域規定了倆種異常狀況:如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展(當前大部分的JAVA虛擬機都動態擴展,只不過JAVA虛擬機規範中也允許固定長度的虛擬機棧),當擴展時無法申請到足夠的內存時會拋出OutOfMemoryError異常
本地方法棧:
    本地方法棧與虛擬機棧所發揮的作用類似,區別:虛擬機棧爲虛擬機執行JAVA方法(也就是字節碼)服務,本地方法棧則是爲虛擬機使用到的Native方法服務。本地方法棧也會拋出:StackOverflowError和OutOfMemoryEorror異常
    Java堆:
    Java堆是來及收集器管理的主要區域,因此很多時候也被稱爲(GC堆)。內存回收的角度看:由於現在收集器基本都是採用的分代收集算法,所以JAVA堆中可以細分爲:新生代和老年代;在細緻點有Eden空間,From Survivor空間、To Survivor空間等。內存分配的角度看:線程共享的Java堆中可能換分出多個線程私有的分配緩衝區(Thread Local Allocation Buffer,TLAB);都是存儲對象實例;
    虛擬機都是按照可擴展來實現的(通過-Xmx和-Xms控制);如果再對中沒有內存完成實例分配,並且堆也無法再擴展時,將會拋出OutOfMemoryError異常
           方法區:方法區和Java堆一樣,是各個線程共享的內存區域,他用於存儲已經被虛擬機加載的類信息,常量,靜態變量,及時編譯器編譯後的代碼等數據。雖然Java虛擬機規範吧方法區描述爲堆的一個邏輯部分,但是他卻又一個別名叫做NON-Heap,目的:與JAVA堆分開
        運行時常量池(Runtime Constant Pool):是方法區的一部分,用於存放編譯器生成的各種字面量和字符引用,這部分內容將在類加載後存放在方法區的運行時常量池中。
    
發佈了33 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章