JAVA程式運行於虛擬機器之上,運行時需要記憶體空間。虛擬機器執行JAVA程式的過程中會把它管理的記憶體劃分為不同的資料區域方便管理。虛擬機器管理記憶體資料區分割如下圖:
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異常。
相關文章教學推薦:java開發入門
#以上是深入淺出JVM記憶體資料區域的詳細內容。更多資訊請關注PHP中文網其他相關文章!