Java運行內存分佈

運行內存分佈

首先,在Java虛擬機中,運行內存的分佈主要有程序計數器、Java虛擬機棧、本地方法棧、Java堆、方法區。

而程序計數器、Java虛擬機棧、本地方法棧都是線程私有的,所以它們的生命週期隨着線程的消失而消失,因此在垃圾回收中,就不需要回收這三個區域。這個我們後面再詳細說明。

程序計數器

程序計數器用於記錄當前虛擬機正在執行的方法,也就是記錄虛擬機正在執行的虛擬機字節碼指令的地址。

注:如果正在執行的方法是本地方法,則爲空。

Java虛擬機棧

Java虛擬機棧是指每個Java方法在執行的同時,會創建一個棧幀,這個棧幀存儲了局部變量表、操作數棧、常量池引用等信息。每一個Java方法的運行和結束就對應的入棧和出棧的一個過程。

本地方法棧

本地方法 棧與Java虛擬機棧類似,但是,它是爲本地方法服務的。本地方法一般就是指那些用其他語言,例如C、C++等語言編寫的方法,並且被編譯成爲本機硬件和操作的程序,需要特殊處理。

Java堆

Java堆是Java虛擬機中的一個重要的存儲區域,大多數對象都是存儲在Java堆中,同時也是垃圾收集的最主要區域。

堆的內存分佈不是連續的,也就是說,是可以動態增加其內存的,如增加內存失敗,則會拋出OutOfMemoryError異常。

方法區

方法區是用於存儲被加載的類的信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

方法區與Java堆一樣,不需要連續的內存,而是可以動態擴展的,失敗一樣會拋出異常。

如果垃圾回收回收了這塊區域,那主要是對常量池的回收和對類的卸載,但是,實現起來會比較難。

方法區中存儲了常量,是因爲方法區中還有一塊區域,叫做:運行時常量池,這個區域用於存放運行時所產生的常量。運行時常量池和字節碼常量池有所不同,運行時常量池會從字節碼常量池中取常量進行存儲,但不意味着運行時常量池的常量都是從字節碼常量池中獲取的,它也會在程序的運行期間將新的常量放進運行時常量池中。例如:String.intern()方法,這個方法的作用就是:先從方法區中的運行時常量池查找是否存在該值,如果有,則返回該值,如果沒有,則將該值放進運行時常量池中。

 

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