天天看點

【JAVA】運作時資料區淺談

                                        運作時資料區淺談

了解jvm記憶體區域的劃分,有助于我們在記憶體洩露和記憶體溢出的時候快速排查錯誤。

jvm将記憶體劃分為如下的幾個區域:

(1)程式計數器(Program Counter Register)

目前線程所執行的位元組碼的行号訓示器,或者說位元組碼指令訓示器。

特點:

【1】線程獨立。這個特點要從多線程的實作機制來談,多線程是通過輪流獲得CPU時間片的方式來實作的,那麼,為了線程切換後能恢複到上一次指令運作的位置,就需要為每一個線程配備程式計數器。是以,程式計數器是線程隔離的。

【2】若目前線程執行的是java方法,程式計數器的内容就是正在執行的位元組碼指令的位址。

【3】若目前線程執行的是一個naive方法,即本地方法,那麼程式計數器的内容為空。

【4】此塊區域是唯一的一塊沒有記憶體溢出的區域

(2)虛拟機棧(VM Stack)

每個方法隻執行的同時,都會在虛拟機棧中建立一個棧幀(Stack Frame)。

棧幀中存放的有:局部變量表、操作數棧、方法出口等

局部變量表中存放着基本資料類型和對象的引用

虛拟機棧的特點:

【1】虛拟機棧可以處在實體上不連續記憶體空間上

【2】線程隔離,每一個線程都擁有屬于自己的虛拟機棧。

【3】大多數虛拟機棧都可以進行動态擴充,用來防止線程請求的棧深度過深,如果在進行擴充時,無法申請到足夠的記憶體,就會引發OutOfMemoryError錯誤。

(3)本地方法棧(Native Method Stack)

與虛拟機棧類似,隻不過虛拟機棧為虛拟機執行java方法服務,而本地方法棧為虛拟機執行本地方法服務。

由于可使用的本地方法多樣,是以,我們并沒有對本地方法棧中使用到的語言,使用方式或者資料結構做出規定,不同的虛拟機可以自由地實作本地方法棧。

(4)堆(Heap) 

幾乎所有的對象執行個體與數組都在堆上配置設定記憶體空間。

堆的特點:

【1】虛拟機啟動時,則建立堆。

【2】線程共享

【3】堆可以處在實體上不連續的記憶體空間上,這一點與虛拟機棧很像。

【4】堆的實作可以是固定大小的,也可以是可擴充的。

(5)方法區(Method Area)

它用于存儲已經被虛拟機加載的類資訊、常量、靜态變量、編譯後的代碼等資料。

特點:

【1】線程共享

【2】也可以進行垃圾收集,記憶體回收的主要目标是針對常量池的回收與類型的解除安裝。但類型解除安裝的條件十分苛刻,是以回收的效果不是太好。