【JVM】堆

一個JVM實例只存在一個堆內存,堆內存的大小是可以調節的。

堆內存邏輯上分爲三部分:新生代、老年代、永久代。

但JDK1.8後,分爲:新生代、老年代、元空間。

新生代

新生代包括伊甸區和倖存區,倖存區又包括倖存0區和倖存1區。

在堆內存中也會存在內存溢出的現象,我們每次通過new出來的對象是存放在堆中的伊甸區,當new對象數量過多,伊甸區達到飽和,觸發GC(Minor GC),進行垃圾回收,在GC過後倖存下來的對象進入倖存區。

經過多次GC過後,倖存區也飽和後,會進行再一次GC,倖存下來的對象進入老年代,直到老年代也飽和,JVM會進行FullGC(Major GC),如果FullGC執行後還是無法進行對象保存,就會產生OOM(OutOfMemoryError)異常。

Minor GC

以下是從GC的角度分解堆內存,大致可分爲新生代和老年代。
在新生代中,伊甸區:倖存0區:倖存1區的比例爲8:1:1。

注意:在GC過程中,倖存0區與倖存1區會存在From區,To區的概念。記住,誰空誰是To區!
在這裏插入圖片描述

當伊甸區飽和後,觸發MinorGC,就是進行(複製-清空-互換)的過程。

  1. 當伊甸區飽和觸發第一次GC,將倖存下來的對象複製到倖存0區(From區),當下一次伊甸區飽和時觸發GC,GC掃描將會掃描伊甸區和From區進行垃圾回收,存活下來的對象進入To區,該對象MaxTenuringThreshold參數+1。
  2. 清空伊甸區和From區。
  3. From區與To區互換,原本的From區變爲To區,原本的To區變爲From區。當MaxTenuringThreshold爲15,對象還是存活則進入老年代。
JVM參數調優


在Java8中,永久代被元空間替代,但他們的本質是類似的。

元空間相比於永久代,永久代使用的是JVM的堆內存,而元空間不在JVM中,元空間使用的是本機的物理內存,所以元空間的大小僅僅受到本地內存大小的限制。

參數 含義
-Xms 設置初始分配大小,默認爲物理內存的1/64
-Xmx 最大分配內存,默認爲物理內存的1/4
-XX:+PrintGCDetails 輸出詳細的GC處理日誌

若堆內存溢出,則會拋出 java.lang.OutOfMemoryError

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