理解“堆”內存模型

Java 中的堆是 JVM 管理的最大的一塊內存空間,主要用於存放Java類的實例對象,其被劃分兩個不同的區域:新生代 ( Young )老年代 ( Old ),其中新生代 ( Young ) 又被劃分爲:Eden、From SurvivorTo Survivor三個區域,如下圖所示:

 

從JDK8開始,Metaspace(元空間)替代了永久代,如下圖所示:

 

無論哪個版本的JDK,其堆內存的劃分都沒有變化,下面詳述Java堆中各個區域:

1堆大小 = 新生代( Young )  + 老年代( Old ),其可以通過參數 –Xms、-Xmx 來指定–Xms用於設置初始分配大小,默認爲物理內存的1/16-Xmx用於設置最大分配內存,默認爲物理內存的1/4。默認情況下,新生代 ( Young ) 與老年代 ( Old ) 的比例的值爲 1:2 ( 該值可以通過參數 –XX:NewRatio 來指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小,老年代 ( Old ) = 2/3 的堆空間大小,如下代碼:

    JDK8運行結果:

2新生代 ( Young ) 被細分爲 Eden 和 兩個 Survivor 區域,爲了便於區分,兩個 Survivor 區域分別被命名爲 from 和 to。默認情況下,Eden : from : to = 8 : 1 : 1 ( 可以通過參數 –XX:SurvivorRatio 來設定 ),即: Eden = 8/10 的新生代空間大小,from = to = 1/10 的新生代空間大小。JVM 每次只使用 Eden 和其中的一塊 Survivor 區域來爲對象服務,所以無論什麼時候,總是有一塊 Survivor 區域是空閒着的,因此,新生代實際可用的內存空間爲 9/10 ( 即90% )的新生代空間。

3、工作原理:

 

 

 

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