1. 程式人生 > 其它 >深入理解Java虛擬機器 第二版讀書隨筆(二)Java記憶體區域與記憶體溢位異常

深入理解Java虛擬機器 第二版讀書隨筆(二)Java記憶體區域與記憶體溢位異常

本篇為第二章前半部分隨記

1.程式計數器

程式計數器可理解為當前執行緒所執行的位元組碼的行號指示器。分支,迴圈,異常,執行緒恢復等基礎功能都需要依賴修改計數器的值來完成。
對於一個處理器核心來說,java多執行緒就是多條執行緒輪流切換分配處理器時間來完成的,每個執行緒裡都需要跳轉到正確的下一個位元組碼指令,因此程式計數器是執行緒隔離的,每個執行緒維護自己的計數器。
對於程式計數器的取值,在執行的方法是java方法時,值為對應位元組碼指令地址;如果執行的是native方法,值為空、
此記憶體區域是唯一一個在JVM規範中沒有規定OOM情況的區域

2.Java虛擬機器棧

Java Virtu Machine Stacks也是執行緒私有的,生命週期與執行緒相同。虛擬機器棧描述的是Java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀 用於儲存 區域性變量表、運算元棧、動態連結、方法出口等資訊。每一個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程。
區域性變量表存放了三種資料:
1.基本資料型別(8種)
2.物件引用 (reference型別,eg. 指向物件起始地址的引用指標)
3.returnAddress型別(指向一條位元組碼指令的地址)
64位長度的 long和double型別會佔用兩個區域性變數空間(Slot),其餘的資料型別只會佔用一個。區域性變量表所需的記憶體空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的區域性變數空間是完全確定的,在方法執行期間不會改變區域性變量表的大小。
虛擬機器棧會發生的兩種異常情況:
1.執行緒請求的棧深度大於虛擬機器所允許的深度,拋 StackOverflowError
2.如果虛擬機器棧可以擴充套件,且擴充套件時無法申請到足夠記憶體時,拋 OutOfMemoryError

3.本地方法棧

Native Method Stack與虛擬機器棧的作用是相似的,區別就是 虛擬機器棧執行Java方法(位元組碼)服務,本地方法棧是虛擬機器用到的Native方法服務。
與虛擬機器棧一樣,本地方法棧區域也會丟擲StackOverflow和OOM

4.Java堆