....

2014年8月2日 星期六

[長知識] Java JVM execution memory


JVM 所管理的記憶體會以下面幾個blocks執行資料區域



1. Program Counter Register:
他就像是個指示燈,程式每存取一行就會去計數,分支、迴轉、跳轉、異常處理、執行續的恢復都是靠計數器完成。


2. VM Stack:
這邊是每個Methods被執行的時候,就會同時建立一個Stack,是用來儲存區域變數表、操作數堆、動態連結、方法出口。

區域變數表存放編譯時期的
型別 boolean, byte, char, short, int, long, double, float、和 reference類型

本區域的兩種異常狀況
StackOverflowError異常 - 執行緒請求的stack深度大於VM stack所允許的深度。
OutOfMemoryError異常 - VM stack動態延伸的時候,沒辦法申請到足夠的記憶體。


3. Native Method Stacks:
跟VM stack的作用很像,不同的地方在於,VM stack是虛擬機器執行Java method服務,而 Native Method Stacks是虛擬機器使用到的Native method服務

本區域的兩種異常狀況
StackOverflowError異常 - 執行緒請求的stack深度大於VM stack所允許的深度。
OutOfMemoryError異常 - VM stack動態延伸的時候,沒辦法申請到足夠的記憶體。


4. Java Heap:
這裡是虛擬機器管理記憶體最大塊的地方,在虛擬機器啟動時候,heap是被所有執行緒共用的一塊記憶體區塊,主要目的是存放物件實體。

這裡也是Garbage Collected Heap的主要區塊,這區塊內還可以分得更精細,如Eden空間、From Survivor空間、To Survivor空間等等,目的就是要做更好的回收記憶體,更快的分配記憶體。


5. Method Area:
這裡是各個執行緒共用的記憶體區塊,存放已經被虛擬機器仔入的類型、常數、靜態變數、編譯後的程式碼等等,跟Java heap不一樣。

一樣,如果method area無法滿足記憶體分配需求,也會跑出OutOfMemoryError。
















沒有留言:

張貼留言