JVM運行時區域(JVM內存)詳解

我們知道的JVM內存區域有:堆和棧,這是一種泛的分法,也是按運行時區域的一種分法,堆是所有線程共享的一塊區域,而棧是線程隔離的,每個線程互不共享。

線程不共享區域

每個線程的數據區域包括程序計數器、虛擬機棧和本地方法棧,它們都是在新線程創建時才創建的。

程序計數器(Program Counter Rerister)

程序計數器區域一塊內存較小的區域,它用於存儲線程的每個執行指令,每個線程都有自己的程序計數器,此區域不會有內存溢出的情況。

虛擬機棧(VM Stack)

虛擬機棧描述的是Java方法執行的內存模型,每個方法被執行的時候都會同時創建一個棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法被調用直至執行完成的過程就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。

本地方法棧(Native Method Stack)

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

虛擬機棧和本地方法棧,當線程請求分配的棧容量超過JVM允許的最大容量時拋出StackOverflowError異常。

線程不共享區域如下圖綠色背景所示。

線程共享區域

線程共享區域包含:堆和方法區。

堆(Heap)

堆是最常處理的區域,它存儲在JVM啓動時創建的數組和對象,JVM垃圾收集也主要是在堆上面工作。

如果實際所需的堆超過了自動內存管理系統能提供的最大容量時拋出OutOfMemoryError異常。

方法區(Method Area)

方法區是可供各條線程共享的運行時內存區域。存儲了每一個類的結構信息,例如運行時常量池(Runtime Constant Pool)、字段和方法數據、構造函數和普通方法的字節碼內容、還包括一些在類、實例、接口初始化時用到的特殊方法。

當創建類和接口時,如果構造運行時常量池所需的內存空間超過了方法區所能提供的最大內存空間後就會拋出OutOfMemoryError

運行時常量池(Runtime Constant Pool)

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

如果方法區的內存空間不能滿足內存分配請求,那Java虛擬機將拋出一個OutOfMemoryError異常。

棧包含Frames,當調用方法時,Frame被推送到堆棧。一個Frame包含局部變量數組、操作數棧、常量池引用。

本文來源微信公衆號:Java技術棧(公衆號ID:javastack)

原文地址:https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247484701&idx=1&sn=db752b494c7ca0baafc0df795343ee9d&chksm=eb53802bdc24093dd76ea3e3047a9bea61c8dc9370724924083525c68d083d3ccf1798295f5f&scene=21#wechat_redirect

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章