關於新生代和老年代

2021-10-25 09:27:46 字數 1921 閱讀 6846

目錄前言

一、年輕代

1.1survivor區解釋

二、老年代

三、full gc 總結

感謝 這裡主要記錄一點對於新生代和老年代的整理了解;

也叫新生代,顧名思義,主要是用來存放新生的物件。新生代又細分為eden區、survivorfrom區、survivorto區

如果新生物件在eden區無法分配空間時,此時發生minor gc。發生minorgc,物件會從eden區進入survivor區,如果survivor區放不下從eden區過來的物件時,此時會使用分配擔保機制將物件直接移動到老年代。

在minor gc開始的時候,物件只會存在於eden區和survivor from區,survivor to區是空的。

minor gc操作後,eden區如果仍然存活(判斷的標準是被引用了,通過gc root進行可達性判斷)的物件,將會被移到survivor to區。而from區中,物件在survivor區中每熬過一次minor gc,年齡就會+1歲,當年齡達到一定值(年齡閾值,預設是15,可以通過-xx:maxtenuringthreshold來設定)的物件會被移動到年老代中,否則物件會被複製到「to」區。經過這次minorgc後,eden區和from區已經被清空,所有物件都在to區連續儲存

「from」區和「to」區互換角色,原survivor to成為下一次gc時的survivor from區, 總之,gc後,都會保證survivor to區是空的。

奇怪為什麼有 from和to,2塊區域?這就要說到新生代minor gc的演算法了:複製演算法,把記憶體區域分為兩塊,每次使用一塊,gc的時候把一塊中的內容移動到另一塊中,原始記憶體中的物件就可以被**了,優點是避免記憶體碎片

具體詳見:survivor區解釋

隨著minor gc的持續進行,老年代中物件也會持續增長,導致老年代的空間也會不夠用,最終會執行major gc(majorgc 的速度比 minor gc 慢很多很多,據說10倍左右)。major gc使用的演算法是:標記清除(**)演算法或者標記壓縮演算法

標記清除(**):

1. 首先會從gc root進行遍歷,把可達物件(存過的物件)打標記;

2. 再從gc root二次遍歷,將沒有被打上標記的物件清除掉。

優點:老年代物件一般是比較穩定的,相比複製演算法,不需要複製大量物件。之所以將所有物件掃瞄2次,看似比較消耗時間,其實不然,是節省了時間。舉個栗子,陣列 1,2,3,4,5,6。刪除2,3,4,如果每次刪除乙個數字,那麼5,6要移動3次,如果刪除1次,那麼5,6只需移動1次。

缺點:這種方式需要中斷其他執行緒(stw),相比複製演算法,可能產生記憶體碎片。

標記壓縮:和標記清除演算法基本相同,不同的就是,在清除完成之後,會把存活的物件向記憶體的一邊進行壓縮,這樣就可以解決記憶體碎片問題。 

當老年代也滿了裝不下的時候,就會丟擲oom(out of memory)異常。

major gc和full gc是不一樣的,前者只清理老年代,後者會清理年輕代+老年代什麼時候觸發:

1. 呼叫system.gc

2. 方法區空間不足

3.老年代空間不足,包括:

gc優化的本質,也是為什麼分代的原因:減少gc次數和gc時間,避免全區掃瞄。

今天總結整理理解了一下關於新生代和老年代的一點知識,希望之後學習會越來越好。

jvm之年輕代(新生代)、老年代、永久代以及gc原理詳解

GC新生代物件晉公升到老年代情況總結

物件優先在eden分配,且新生代物件晉公升到老年代有多種情況,現在做乙個總結 1 eden區滿時,進行minor gc,當eden和乙個survivor區中依然存活的物件無法放入到survivor中,則通過分配擔保機制提前轉移到老年代中。2 若物件體積太大,新生代無法容納這個物件,xx preten...

如何確保新生代物件被老年代物件引用的時候不被gc

stop the world stop the world會在任何一種gc演算法中發生。stop the world意味著 jvm 因為要執行gc而停止了應用程式的執行。當stop the world發生時,除了gc所需的執行緒以外,所有執行緒都處於等待狀態,直到gc任務完成。gc優化很多時候就是指...

新生代的配置

引數 xmn可以用於設定新生代的大小。設定乙個較大的新生代大小會減少老年代的大小,此引數對系統效能以及gc影響很大。新生代的大小一般設定為整個堆空間的1 3到1 4左右。引數 xx survivorratio用來設定新生代中eden空間和from to空間的比例關係,如下 xx survivorra...