標籤:java虛擬機器 記憶體
java中的常用記憶體地區總結:
<開發實戰經典>
(1)棧記憶體空間:儲存所有的對象名稱
(2)堆記憶體空間:儲存每個對象的具體屬性內容
(3)全域資料區:儲存static類型的屬性
(4)全域代碼區:儲存所有的方法定義
<講師>
(1)棧區:存放局部變數
(2)堆區:存放對象屬性,new出來的資料
(3)方法區:儲存和class相關的資訊
(4)本地方法區:系統相關,無需程式員管理
(5)寄存器:cpu相關,無需程式員管理
<深入理解java虛擬機器>
(1)程式計數器(program counter register):
一塊較小的記憶體空間,可看作是當前線程(線程私人)所執行的位元組碼的行號指標.位元組碼解譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令.
(2)java虛擬機器棧(vm stack):
也是線程私人,生命週期與線程相同,虛擬機器棧描述的是java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀(stack frame)用於儲存局部變數表/運算元棧/動態連結/方法出口等資訊.每個方法從調用至完成的過程就對應著一個棧幀在虛機棧中從入棧到出棧的過程.
(3)本地方法棧(native method stack):
與虛擬機器棧發揮的作用類似,區別在於虛擬機器棧執行的是java方法服務,而本地方法棧執行的是本地(native)方法服務.
(4)方法區(method area):
與堆一樣被所有線程共用,用於儲存已被虛擬機器載入的類資訊/常量/靜態變數/即時編譯器編譯後的代碼等資料,也叫做非堆(non-heap),也有稱為"永久代"的.包括運行時常量池(runtime constant pool)
--運行時常量池(runtime constant pool):
class檔案中除了有類的版本/欄位/方法/介面等描述資訊外,還有就是常量池,用於存放編譯器產生的各種字面量和符號引用.
(5)堆(heap):
記憶體中最大的地區,被所有線程共用.作用是存放所有對象執行個體及數組(暫不考慮逃逸分析技術).堆也是GC管理的主要區域,所以也被稱作是"GC堆",由於收集器的分代收集演算法,所以java堆還可以細分為:新生代和老年代(再細緻一點的還有:eden空間-from survivor空間- to surviver空間).從記憶體配置的角度看,線程共用的java堆中可能劃分出多個線程私人的分配緩衝區(TLAB).
java記憶體地區總結