常用的GC算法:



1)標記非活動對象

--何爲非活動對象,通俗的講,就是無引用的對象。



追蹤root對象算法: 深度追蹤root對象,將heap中所有被引用到的root做標誌,所有未被標誌的對象視爲非活動對象,所佔用的空間視爲非活動內存。



2)清理非活動對象



Copy算法:          

方 法:將內存分爲兩個區域(from space和to space)。所有的對象分配內存都分配到from space。在清理非活動對象階段,把所有標誌爲活動的對象,copy到to space,之後清楚from space空間。然後互換from sapce和to space的身份。既原先的from space變成to sapce,原先的to space變成from space。每次清理,重複上述過程。



優點:copy算法不理會非活動對象,copy數量僅僅取決爲活動對象的數量。並且在copy的同時,整理了heap空間,即,to space的空間使用始終是連續的,內存使用效率得到提高。



缺點:劃分from space和to space,內存的使用率是1/2。

 Compaction算法:

方法:在清理非活動對象階段,刪除非活動對象佔用內存,並且把活動對象向heap的底部移動,直到所有的活動對象被移到heap的一側。

優點:無須劃分from sapce和to space,提高內存的使用率。並且compaction後的內存空間也是連續分配的。

缺點:該算法相對比較複雜。

sun jdk gc介紹:

在減少gc之前,先來看看來自IBM的一組統計數據:

98%的java對象,在創建之後不久就變成了非活動對象;只有2%的對象,會在長時間一直處於活動狀態。



如果能對這兩種對象區分對象,那麼會提交GC的效率。在sun jdk gc中(具體的說,是在jdk1.4之後的版本),提出了不同生命週期的GC策略。



young generation:

生 命週期很短的對象,歸爲young generation。由於生命週期很短,這部分對象在gc的時候,很大部分的對象已經成爲非活動對象。因此針對young  generation的對象,採用copy算法,只需要將少量的存活下來的對象copy到to space。存活的對象數量越少,那麼copy算法的效率越高。

young generation的gc稱爲minor gc。經過數次minor gc,依舊存活的對象,將被移出young generation,移到tenured generation(下面將會介紹)





young generation分爲:

eden:每當對象創建的時候,總是被分配在這個區域

survivor1:copy算法中的from space

survivor2:copy算法中的to sapce (備註:其中survivor1和survivor2的身份在每次minor gc後被互換)

minor gc的時候,會把eden+survivor1(2)的對象copy到survivor2(1)去。

tenured generation:

生 命週期較常的對象,歸入到tenured generation。一般是經過多次minor gc,還 依舊存活的對象,將移入到tenured generation。(當然,在minor gc中如果存活的對象的超過survivor的容量,放不下的對象會直接移入到tenured generation)

tenured generation的gc稱爲major gc,就是通常說的full gc。



採用compactiion算法。由於tenured generaion區域比較大,而且通常對象生命週期都比較常,compaction需要一定時間。所以這部分的gc時間比較長。

minor gc可能引發full gc。當eden+from space的空間大於tenured generation區的剩餘空間時,會引發full gc。這是悲觀算法,要確保eden+from space的對象如果都存活,必須有足夠的tenured generation空間存放這些對象。

Permanet Generation:

該區域比較穩定,主要用於存放classloader信息,比如類信息和method信息。

對於spring hibernate這些需要動態類型支持的框架,這個區域需要足夠的空間。



這部分內容相對比較理論,可以結合jstat,jmap等命令(當然也可以使用jconsole,jprofile,gciewer等工具),觀察jdk gc的情

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