新生代物件分配與回收過程
物件分配過程:概述
為新物件記憶體是一件非常嚴謹和複雜的任務,JVM的設計者不僅需要考慮記憶體如何分配,在哪裡分配等問題,並且由於記憶體分配演算法與記憶體回收演算法密切相關,所以還需要考慮GC執行完記憶體回收後是否會在記憶體空間中產生記憶體碎片。
1,new的物件先放伊甸園區。此區有大小限制。
2,當伊甸園的空間填滿時,程式又需要建立物件,JVM的垃圾回收器將對伊甸園區進行垃圾回收(GC),將伊甸園區中不再被其他物件所引用的物件進行銷燬。在載入新的物件放到伊甸園區
3,然後將伊甸園中的剩餘物件移動到倖存者0區。
4,如果再次觸發垃圾回收,此時上次倖存下來的放到倖存者0區的,如果沒有回收,就會放到倖存者1區。
5,如果再次經歷垃圾回收,此時會重新放到倖存者0區,接著再去倖存者1區。
6,啥時候能去養老區呢?可以設定次數。預設15次。
可以設定引數:-XX:MaxTenuringThreshold=<N>進行設定。
7,在養老區,相對悠閒。當養老區記憶體不足時,再次觸發GC:Major GC,進行養老區的記憶體清理。
8,若養老區執行了Major GC之後發現依然無法進行物件的儲存,就會產生OOM異常。
java.lang.OutOfMemoryError:Java heap space
總結:
針對倖存者s0,s1區的總結:複雜之後交換,誰空誰to。
關於垃圾回收:頻繁在新生區收集,很少在養老區收集,幾乎不在永久區/元空間收集。