JVM筆記五-堆區

JVM筆記五-堆區

在JVM中,堆區是重中之重。通過前面文章的學習,我們知道了,棧區是不會有垃圾回收的,所以,經常說的垃圾回收,其實就是回收的是堆區的數據。在這裏,我們將會看到傳說中的,新生代、老年代、永久代(元空間)。凱哥Java(kaigejava)歡迎大家一起學習。

堆(Heap):

一個JVM實例只存在一個堆內存,堆內存的大小是可以調節的。類加載器讀取了類文件後,需要把類、方法、常變量放到堆內存中,保存所有引用類型的真實信息,以方便執行器執行,堆內存分爲三個部分:

堆內存分區:

Young Generation Space 新生區 Young/New

Tenure generation space 老年代 Old/Tenure

Permanent space 永久區/元空間 Perm

Java 7之前的堆內存示意圖:

編輯

簡版流程:

編輯
編輯

新生區是類的誕生、成長、消亡的區域,一個類在這裏產生、應用,最後被垃圾回收器收集,結束生命。

新生區又分爲兩部分:伊甸園區(Eden space)和倖存者區(Survivor space)。所有的類都是在伊甸園區被new出來的。

倖存區有兩個:0區(Survivor 0 space)和1區(Survivor 1 space).

當伊甸園區的空間用完時候,程序又需要創建對象,JVM的垃圾回收器將對伊甸園區進行垃圾回收(Minor GC,也叫輕GC 或者是YGC),將伊甸園區中的不再被其他對象所引用的對象進行銷燬。然後伊甸園中的剩餘對象移動到倖存0區(也叫from區)。若倖存0區也滿了,再對該地區進行垃圾回收,然後移動到1區(也叫to區)。

如果1區也滿了怎麼辦呢?在經歷了15次YGC後,倖存1區也滿了,那麼這個時候,JVM將會把這些數據移動到養老區。如果養老區也滿了,這個時候就會進行MajorGC(也稱Full GC 檢查FGC)。執行full GC對養老區的內存進行清理。如果養老區執行了Full GC之後,發現依然無法進行對象的保存,這個時候就會出現OOM(OutOfMemoryError)異常了。

如果出現了java.lang.OutOfMemoryError:java heap space異常。說明Java虛擬機的堆內存不夠用了。主要原因有以下兩種:

1:java虛擬機的堆內存設置不夠,可以通過參數-Xms、-Xmx來調整

2:代碼中創建了大量的大對象,並且長時間不能被垃圾回收器回收的(內存地址被引用了)

當你的才華撐不起你的野心的時候,你就應該靜下心來學習;

當你的能力還駕馭不了你的目標時,就應該沉下心來,歷練;

夢想,不是浮躁,而是沉澱和積累,只有拼出來的美麗,沒有等出來的輝煌,機會永遠是留給最渴望的那個人,學會與內心深處的你對話,問問自己,想要怎樣的人生,靜下心來學習,耐心沉澱,送給自己,共勉!

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