首頁  >  文章  >  Java  >  java中記憶體區域的劃分

java中記憶體區域的劃分

王林
王林轉載
2019-11-29 16:54:372121瀏覽

java中記憶體區域的劃分

什麼是JVM?

JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是透過在實際的計算機上模擬模擬各種計算機功能來實現的。 Java虛擬機器包括一套字節碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個儲存方法域。

JVM封鎖了與特定作業系統平台相關的訊息,讓Java程式只需產生在Java虛擬機上執行的目標程式碼(字節碼),就可以在多種平台上不加修改地運行。 JVM執行字節碼時,實際上最後還是把字節碼解釋成具體平台上的機器指令執行。

JVM記憶體區域

JVM在運行時候會將他管理的記憶體劃分為多個區域,每個區域都有自己的用途,生命週期。下面我們根據記憶體分區圖片逐一擊破:

java中記憶體區域的劃分

程式計數器(Program Counter Register)

程式計數器所佔記憶體小,他的作用可以看做是當前執行緒所執行的字節碼的指示器,透過改變計數器的值來取得下一條字節碼指令。

程式計數器在執行Native方法的時候,計數器的值為空(undefined)。

程式計數器是執行緒私有的,每個執行緒都會分派一個。

線上影片教學分享:java學習

虛擬機器堆疊(VM Stack)

虛擬機器堆疊為JVM執行java方法服務,每個方法執行的時候都會建立一個棧楨(Stack Frame)用來儲存局部變數表、運算元堆疊、動態連結、方法出口等資訊。每一個方法從呼叫直到執行結束,就對應一個堆疊幀從虛擬機器棧中入棧到出棧的過程。

虛擬機器堆疊的局部變數表內儲存了以下資料:

基本類型資料(boolean、byte、char、short、int、float、long、double)

#物件參考(reference 類型)

returnAddress 類型(指向了一條字節碼指令的位址)

需要注意的是局部變數表所需的記憶體空間在編譯期間就已經確定了,大小不再變動。

虛擬機器堆疊也是執行緒私有的,每個執行緒都會分派一個。

JVM對虛擬機器堆疊規定了兩種例外:

StackOverflowError:執行緒請求的堆疊深度大於虛擬機器所允許的深度。

OutOfMemoryError:如果虛擬機器堆疊可以動態擴展,而擴展時無法申請到足夠的記憶體。

本機方法堆疊(Native Method Stack)

本機方法堆疊與虛擬機器堆疊類似,主要差異在於本機方法堆疊是專門為Native方法提供服務。

Native方法:在java中由Native關鍵字聲明的方法,非java語言實現,是引用本地庫提供的第三方語言方法。

本地方法堆疊也是執行緒私有的,每個執行緒都會分派一個。

堆(Heap)

#堆是所有執行緒共享的記憶體區域,在JVM啟動時創建,一般是JVM內佔用最大的一塊,垃圾收集器( GC)管理的主要區域。

堆中主要儲存的資料為:

物件

陣列

堆疊可以在物理上不連續,而只要在邏輯上連續即可,因此是一個可擴展的記憶體區域。

當堆記憶體大小不夠建立物件或陣列所佔用的記憶體大小,且不能夠再擴充時,會拋出OutOfMemoryError例外狀況。

方法區(Method Area)

方法區也是所有執行緒共享的記憶體區域。

方法區主要儲存的資料為:

已被JVM載入的類別資訊

常數(從jdk1.7開始,運行時常數池移動到了堆中)

靜態變數

即時編譯器編譯後的程式碼等資料

垃圾收集器(GC)比較少出現在這個區域,主要的記憶體回收目標是常數池的回收和對類型的卸載。

當方法區無法滿足記憶體分配需求時,就會拋出OutOfMemoryError例外狀況。

常數池(Runtime Constant Pool)

常數池屬於方法區一部分,用於存放編譯期產生的各種字面量和符號參考。編譯期和運行期(String 的 intern() )都可以將常數放入池中。記憶體有限,無法申請時拋出 OutOfMemoryError異常。

從jdk1.7開始,運行時常數池移動到了堆中。

直接記憶體(Direct Memory)

直接記憶體並不是JVM運行時記憶體資料區域,也不是JVM規格中定義的記憶體。

直接記憶體佔用實體記憶體大小,需要注意在分配JVM記憶體的時候要把直接記憶體也算在內,否則在動態擴充記憶體時可能會出現OutOfMemoryError異常。

相關文章教學推薦:java入門學習

以上是java中記憶體區域的劃分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除