JVM學習筆記

lwx_R發表於2024-04-17

自動記憶體管理

執行時資料區

執行時資料區主要包括虛擬機器棧、本地方法棧、程式計數器、方法區、堆等,其中方法區和堆屬於執行緒共享記憶體區域;虛擬機器棧和本地方法棧屬於執行緒隔離的資料區

 

程式計數器

佔用記憶體空間較小,可以當作是當前執行緒執行的位元組碼行號指示器。jvm的多執行緒是通過執行緒切換並分配一定處理時間的方式來實現的,所以多個執行緒在執行時候,當前執行緒退出cpu時,必須有個東西記住當前執行緒執行的java方法的虛擬機器位元組碼指令的地址。如果當前正在執行的方法是本地方法(native),計數器值為空。程式計數器不會導致oom

java虛擬機器棧

java虛擬機器棧也是屬於執行緒私有的一塊記憶體區域。生命週期和執行緒相同;java虛擬機器棧描述的時java方法執行時候的記憶體模型:每個方法的執行時候會建立一個棧幀,用處儲存區域性變數表、運算元棧、方法出口、動態連結等資訊。每個方法的呼叫到執行完畢,對應的就是這個棧幀的入棧到出棧的過程;

區域性變數表:用於儲存物件的引用(可能是物件在堆中的記憶體地址,也可能是一個該物件的控制程式碼的地址,編譯期可知的各種基本資料型別,其中long和double各佔兩個位元組,別的都時一個位元組。區域性變數表在棧幀中的空間大小是進入方法時候就已經完全確定了,而且中間不會改變。

運算元棧: 一個方法的呼叫執行其實就是方法呼叫時建立一個棧幀,然後再棧幀內部會根據類的資訊獲取指令,從區域性變數表中取資料,進行運算元棧的入棧出棧方式執行指令。

java堆

java堆是虛擬機器管理的最大的一塊記憶體區域,在虛擬機器啟動的時候分配空間;java堆存在的主要作用是存放物件例項;他也是垃圾收集器主要管理的一塊記憶體區域;從垃圾回收的角度來看,可以將java堆分為新生代和老年代,細一點可以分為eden區,to Survivor區,from Survivor區等。從記憶體分配的角度,java堆可能劃分出來多個執行緒私有的記憶體分配緩衝區( Thread Local Allocation Buffer)簡稱TLAB;我們系統執行中出現的oom最多就是出現在java堆中。

方法區

 

相關文章