JVM執行時區域詳解。

weixin_34221276發表於2017-11-14
image

我們知道的JVM記憶體區域有:堆和棧,這是一種泛的分法,也是按執行時區域的一種分法,堆是所有執行緒共享的一塊區域,而棧是執行緒隔離的,每個執行緒互不共享。

執行緒不共享區域

每個執行緒的資料區域包括程式計數器、虛擬機器棧和本地方法棧,它們都是在新執行緒建立時才建立的。

程式計數器(Program Counter Rerister)

程式計數器區域一塊記憶體較小的區域,它用於儲存執行緒的每個執行指令,每個執行緒都有自己的程式計數器,此區域不會有記憶體溢位的情況。

虛擬機器棧(VM Stack)

虛擬機器棧描述的是Java方法執行的記憶體模型,每個方法被執行的時候都會同時建立一個棧幀(Stack Frame)用於儲存區域性變數表、運算元棧、動態連結、方法出口等資訊。每一個方法被呼叫直至執行完成的過程就對應著一個棧幀在虛擬機器棧中從入棧到出棧的過程。

本地方法棧(Native Method Stack)

本地方法棧用於支援本地方法(native標識的方法,即非Java語言實現的方法)。

虛擬機器棧和本地方法棧,當執行緒請求分配的棧容量超過JVM允許的最大容量時丟擲StackOverflowError異常。

執行緒不共享區域如下圖綠色背景所示。

[圖片上傳中...(image-354d3a-1510636929990-1)]

執行緒共享區域

執行緒共享區域包含:堆和方法區。

堆(Heap)

堆是最常處理的區域,它儲存在JVM啟動時建立的陣列和物件,JVM垃圾收集也主要是在堆上面工作。

如果實際所需的堆超過了自動記憶體管理系統能提供的最大容量時丟擲OutOfMemoryError異常。

方法區(Method Area)

方法區是可供各條執行緒共享的執行時記憶體區域。儲存了每一個類的結構資訊,例如執行時常量池(Runtime Constant Pool)、欄位和方法資料、建構函式和普通方法的位元組碼內容、還包括一些在類、例項、介面初始化時用到的特殊方法。

當建立類和介面時,如果構造執行時常量池所需的記憶體空間超過了方法區所能提供的最大記憶體空間後就會丟擲OutOfMemoryError

執行時常量池(Runtime Constant Pool)

執行時常量池是方法區的一部分,每一個執行時常量池都分配在JVM的方法區中,在類和介面被載入到JVM後,對應的執行時常量池就被建立。執行時常量池是每一個類或介面的常量池(Constant_Pool)的執行時表現形式,它包括了若干種常量:編譯器可知的數值字面量到必須執行期解析後才能獲得的方法或欄位的引用。

如果方法區的記憶體空間不能滿足記憶體分配請求,那Java虛擬機器將丟擲一個OutOfMemoryError異常。

image

棧包含Frames,當呼叫方法時,Frame被推送到堆疊。一個Frame包含區域性變數陣列、運算元棧、常量池引用。

推薦閱讀


阿里高階Java面試題(首發,70道,帶詳細答案)

2017派臥底去阿里、京東、美團、滴滴帶回來的面試題及答案

Spring面試題(70道,史上最全)

17張圖揭密支付寶系統架構

阿里巴巴,排行前10的開源專案!

2018年必看:關於區塊鏈技術的10本書

分享Java乾貨,高併發程式設計,熱門技術教程,微服務及分散式技術,架構設計,區塊鏈技術,人工智慧,大資料,Java面試題,以及前沿熱門資訊等。


掃我關注

相關文章