1. 程式人生 > >JVM_02 堆、棧 、方法區概念和聯系

JVM_02 堆、棧 、方法區概念和聯系

必須 常量池 ima 對象 一次 指針 局部變量表 擁有 共享

一、三者聯系

1、堆:解決數據的存儲問題( 即 數據怎麽放,放到哪 )。

2、棧:解決程序運行的問題( 即 程序如何執行,或者說如何處理數據 )。

3、方法區:輔助堆棧的一塊永久區,解決堆棧信息的產生,是先決條件。

  我們創建一個對象,User:那麽 User類的一些信息 ( 類信息、靜態信息 ) 都存在於方法區中,我們可以根據這些信息來創建對應的對象。方法區中相當於存放著創建對象的模板。

二、堆

1、根據垃圾回收機制不同, 堆有可能擁有不同的結構,最常見的就是將整個分為新生代和老年代。其中新生代存放新生的對象或者年齡不大的對象,老年代則存放老年對象。

2、新生代分為 eden(伊甸園)

區、s0 區、s1 區, s0 s1 也被成為 from to 區域,他們是兩個大小相等並且可以互換角色的空間內存。

3、絕大多數情況下,對象首先分配在 eden 區,在一次新生代回收後,如果對象還存活,則會進入 s0 s1,之後每經過一次新生代回收,如果對象還存活則它的年齡加1當對象達到一定年齡後,則進入老年代

  ( 默認經過 15 次GC 後進入老年代 )。

4、s0 區和 s1 區之間采用的是復制算法

  復制算法:其核心思想就是將內存空間分為兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用的內存中存留的對象復制到未被使用的內存中去,之後去清除之前正在使用的內存塊中所有的對象。反復交換兩個內存的角色,完成垃圾回收。

技術分享圖片

三、棧

棧是一塊私有的內存空間,一個棧,一般由三部分組成:局部變量表,操作數棧,和幀數區域。

1、局部變量表:用於報錯函數的參數及局部變量

2、操作數棧:主要保存計算過程的中間結果,同時作為計算過程中變量臨時的存儲空間

3、幀數區域:出了局部變量表和操作數棧以外,棧還需要一些數據來支持常量池的解析,這裏幀數區域保存著訪問常量池的指針,方便程序訪問常量池,另外,當函數返回或者出現異常時,虛擬機必須有一個異常處理表,方便

  發送異常的時候找到異常的代碼,因此異常處理表也是幀數區域的一部分。

四、方法區

java方法區和堆一樣,方法區是一塊所有線程共享的區域,他保存系統的類的信息,比如類的字段、方法、常量池等。方法區的大小決定了系統可以保存多少個類,如果系統定義太多的類,會導致方法區溢出。虛擬機同樣會拋出

  內存溢出的錯誤。方法區可以理解為永久區。

JVM_02 堆、棧 、方法區概念和聯系