JVM:簡述對JVM內存數據區域的認識

JAVA程序運行於虛擬機之上,運行時需要內存空間。虛擬機執行JAVA程序的過程中會把它管理的內存劃分爲不同的數據區域方便管理。虛擬機管理內存數據區域劃分如下圖:
在這裏插入圖片描述

一、程序計數器(Program Counter Register)

行號指示器,字節碼指令的分支、循環、跳轉、異常處理、線程恢復(CPU切換),每條線程都需要一個獨立的計數器,線程私有內存互不影響,該區域不會發生內存溢出異常。

二、虛擬機棧(VM Stack)

虛擬機棧(VM Stack)是線程私有的,聲明週期與線程相同,虛擬機棧是Java方法執行的內存模型,每個方法被執行時都會創建一個棧幀,即方法運行期間的基礎數據結構。

棧幀用於存儲:局部變量表、操作數棧、動態鏈接、方法出口等,每個方法執行中都對應虛擬機棧幀從入棧到處棧的過程。是一種數據結構,是虛擬機中的局部變量表,對應物理層之上的程序數據模型。

局部變量表,是一種程序運行數據模型,存放了編譯期可知的各種數據類型例如:
Boolean、byte、char、short、int、float、long、double、對象引用類型(對象內存地址變量,指針或句柄)。程序運行時,根據局部變量表分配棧幀空間大小。在運行中,大小是不變的異常類型:stackOverFlowError 線程請求棧深度大於虛擬機允許深度 OutOfMemory 內存空間耗盡無法進行擴展。

三、本地方法棧(Native Method Stack)

與虛擬機棧類似,虛擬機棧爲Java程序服務,本地方法棧支持虛擬機的運行服務,具體實現由虛擬機廠商決定,也會拋出 stackOverFlowError、OutOfMemory異常。

四、堆(Heap)

堆(Heap)是虛擬機管理內存中最大的一部分,被所有線程共享,用於存放對象實例(對象、數組),物理上不連續的內存空間,由於GC收集器,分代收集,所以劃分爲:新生代 Eden、From SurVivor空間、To SurVivor空間,allot buffer(分配空間),可能會劃分出多個線程私有的緩衝區,老年代。

五、方法區(Method Area)

方法區(Method Area)與堆區一樣屬於線程共享的內存區域,用於存儲虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼(動態加載OSGI)等數據。理論上屬於java虛擬機的一部分,爲了區分開來叫做 Non-Heap非堆。

這個區域可以選擇不進行垃圾回收,該區域回收目的主要是常量池的回收,及類型的卸載class,內存區不足時會拋出OutOfMemory異常

運行時常量池:方法區的一部分,Class的版本、字段、接口、方法等,及編譯期生成的各種字面量、符號引用,編譯類加載後存放在該區域。會拋出OutOfMemory異常。

六、直接內存(Direct Memory)

直接內存(Direct Memory)不屬於虛擬內存區域,是一種基於通道與緩衝區的IO方式,可以使用本地函數直接分配堆外內存,在堆中存儲引用的外部內存地址,通過引用完成對直接引用內存的操作,1.4之後提供的NIO顯著提高效率,避免了堆內存與Native內存的來回複製操作,不受虛擬機內存控制,會拋出OUTOfMemory異常。

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