標籤:盡心 常量 本地 物理 常量池 沒有 運行 str 經曆
Java記憶體結構,分區,每個區放置什麼
程式計數器:(線程私人)當前線程所執行的位元組碼的行號指標,通過改變這個計數器的值來選取下一條需要執行的位元組碼的指令,以程式中分支、迴圈和跳轉等流程的控制都離不開這個計數器的指示。
虛擬機器棧:(線程私人),每個方法在執行時都會建立一個棧楨,用於儲存局部變數表、運算元棧、動態連結和方法出口等資訊。一個方法從調用到執行完成的過程,對應的棧楨在虛擬機器棧的進出過程。當線程結束時,虛擬機器棧中的資料會被自動的釋放。
局部變數表:基礎資料型別 (Elementary Data Type)、對象的引用、返回地址,局部變數表鎖需要的記憶體空間是在程式編譯時間就已經會被確定好的。
本地方法棧:(線程私人)虛擬機器棧是為執行java方法所服務的,而本地方法棧是為了虛擬機器使用到的本地方法鎖服務的。
堆區:(線程共用)java堆是被所有的線程所共用的一片地區,所有的對象的執行個體和數組都會在堆區盡心分配。java堆細分:新生代和老年代;也可能會劃分出多個線程鎖共用額分配緩衝區TLAB;
Java堆可以在物理上不連續的記憶體空間中,只要邏輯上連續就可以。
方法區:(線程共用)儲存已經被虛擬機器載入過的類的資訊、常量、靜態變數和及時編譯器編譯後的代碼。在方法區中一個地區叫做:運行時常量池,用於存放編譯後產生的字面量和符號的引用。
堆的分代
(1)年輕代:
所有新產生的對象首先都是放在年輕代的。年輕代的目標就是儘可能快速的收集掉那些生命週期短的對象。年輕代分三個區。一個Eden區,兩個Survivor區(一般而言)。
大部分對象在Eden區中產生。當Eden區滿時,還存活的對象將被複製到Survivor區(兩個中的一個),當一個Survivor區滿時,此區的存活對象將被複製到另外一個Survivor區,當另一個Survivor區也滿了的時候,從前一個Survivor區複製過來的並且此時還存活的對象,將被複製“年老區(Tenured)”。
(2)年老代:
在年輕代中經曆了N(可配置)次記憶體回收後仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命週期較長的對象。
(3)持久代:
用於存放待用資料,如 Java Class, Method 等。持久代對記憶體回收沒有顯著影響。
java虛擬機器