JVM筆記五-堆區java
在JVM中,堆區是重中之重。經過前面文章的學習,咱們知道了,棧區是不會有垃圾回收的,因此,常常說的垃圾回收,其實就是回收的是堆區的數據。在這裏,咱們將會看到傳說中的,新生代、老年代、永久代(元空間)。凱哥Java(kaigejava)歡迎你們一塊兒學習。ide
堆(Heap):學習
一個JVM實例只存在一個堆內存,堆內存的大小是能夠調節的。類加載器讀取了類文件後,須要把類、方法、常變量放到堆內存中,保存全部引用類型的真實信息,以方便執行器執行,堆內存分爲三個部分:spa
堆內存分區:orm
Young Generation Space 新生區 Young/New對象
Tenure generation space 老年代 Old/Tenureblog
Permanent space 永久區/元空間 Perm內存
Java 7以前的堆內存示意圖:虛擬機
簡版流程:it
新生區是類的誕生、成長、消亡的區域,一個類在這裏產生、應用,最後被垃圾回收器收集,結束生命。
新生區又分爲兩部分:伊甸園區(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:代碼中建立了大量的大對象,而且長時間不能被垃圾回收器回收的(內存地址被引用了)
當你的才華撐不起你的野心的時候,你就應該靜下心來學習;
當你的能力還駕馭不了你的目標時,就應該沉下心來,歷練;
夢想,不是浮躁,而是沉澱和積累,只有拼出來的美麗,沒有等出來的輝煌,機會永遠是留給最渴望的那我的,學會與心裏深處的你對話,問問本身,想要怎樣的人生,靜下心來學習,耐心沉澱,送給本身,共勉!