JVM_02 堆、棧 、方法區概念和聯系
一、三者聯系
1、堆:解決數據的存儲問題( 即 數據怎麽放,放到哪 )。
2、棧:解決程序運行的問題( 即 程序如何執行,或者說如何處理數據 )。
3、方法區:輔助堆棧的一塊永久區,解決堆棧信息的產生,是先決條件。
我們創建一個對象,User:那麽 User類的一些信息 ( 類信息、靜態信息 ) 都存在於方法區中,我們可以根據這些信息來創建對應的對象。方法區中相當於存放著創建對象的模板。
二、堆
1、根據垃圾回收機制不同, 堆有可能擁有不同的結構,最常見的就是將整個堆分為新生代和老年代。其中新生代存放新生的對象或者年齡不大的對象,老年代則存放老年對象。
2、新生代分為 eden(伊甸園)
3、絕大多數情況下,對象首先分配在 eden 區,在一次新生代回收後,如果對象還存活,則會進入 s0 或 s1,之後每經過一次新生代回收,如果對象還存活則它的年齡加1,當對象達到一定年齡後,則進入老年代
( 默認經過 15 次GC 後進入老年代 )。
4、s0 區和 s1 區之間采用的是復制算法
復制算法:其核心思想就是將內存空間分為兩塊,每次只使用其中一塊,在垃圾回收時,將正在使用的內存中存留的對象復制到未被使用的內存中去,之後去清除之前正在使用的內存塊中所有的對象。反復交換兩個內存的角色,完成垃圾回收。
三、棧
棧是一塊私有的內存空間,一個棧,一般由三部分組成:局部變量表,操作數棧,和幀數區域。
1、局部變量表:用於報錯函數的參數及局部變量
2、操作數棧:主要保存計算過程的中間結果,同時作為計算過程中變量臨時的存儲空間
3、幀數區域:出了局部變量表和操作數棧以外,棧還需要一些數據來支持常量池的解析,這裏幀數區域保存著訪問常量池的指針,方便程序訪問常量池,另外,當函數返回或者出現異常時,虛擬機必須有一個異常處理表,方便
發送異常的時候找到異常的代碼,因此異常處理表也是幀數區域的一部分。
四、方法區
java方法區和堆一樣,方法區是一塊所有線程共享的區域,他保存系統的類的信息,比如類的字段、方法、常量池等。方法區的大小決定了系統可以保存多少個類,如果系統定義太多的類,會導致方法區溢出。虛擬機同樣會拋出
內存溢出的錯誤。方法區可以理解為永久區。
JVM_02 堆、棧 、方法區概念和聯系