JVM中的垃圾收集算法


-----------------------------------------------------------------------
垃圾收集算法
-----------------------------------------------------------------------		
1,標記-清除算法
	概念:首先標記出所有需要回收的對象,在標記完成後統一回收所有標記的對象。
	特點:
		1)效率問題:標記和清除的效率都不高。
		2)空間問題:標記清除之後會產生大量不連續的內存碎片,碎片太多可能會導致以後需要分配較大的對象時,因無法找到足夠大的連續內存而不得不提前觸發另一次垃圾收集的動作。
			
2,複製算法
	概念:將可用的內存分爲(容量)大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完後,就將還存活的對象複製到另一塊上面,然後再把已使用過的內存塊一次性清理掉。
	特點:
		1)效率:實現簡單,運行效率高
		2)空間問題:將內存的大小縮小爲原來的一半
	應用:新生代的回收
		提醒:
			1)新生代中大部分的對象時“朝生夕死”的,所有並不需要安裝1:1的比例來劃分內存空間。
			2)虛擬機將新生代內存分爲一塊較大的Eden空間和兩塊較小的Survivor空間(Survivor to和Survivor from),每次使用Eden空間和其中一塊Survivor空間。
		
		過程:
			1)每次創建對象時,首先會在Eden中分配,若Eden已滿,則在Survior from中分配,如果Eden和Survior from都無法容納這個對象,則JVM會進行一次GC;
			2)GC時,將Eden和Survivor from中還存活的對象一次性地複製到另外一塊Survivor to空間上,最後清理掉Eden和Survivor form空間;
			3)當Survivor to空間不夠用時,需要依賴老年代進行分配擔保。

		例如:HotSpot虛擬機默認Eden和兩個Survivor的大小比例是8:1:1,也就是每次新生代中可用內存的空間爲整個新生代容量的90%,只有10%的內存會被浪費掉。

	內存分配擔保機制:
		在新生代GC(Minor GC)前,虛擬機會先檢查老年代中可用的最大連續空間是否大於新生代所有對象的總空間
			1)如果滿足條件,那麼新生代GC就可以確保是安全的
			2)如果不滿足條件,則虛擬機會查看HandlePromotionFailure設置是否允許擔保失敗。
				如果允許擔保失敗,那麼會繼續檢查老年代中可用的最大連續空間是否大於歷次晉升到老年代的對象的平均大小,
					如果大於,將會進行一次新生代GC,儘管這次新生代GC是有風險的
					如果小於,那麼這時不會進行新生代GC,而是改爲進行一次老年代GC(Full GC)
				如果不允許擔保失敗,那麼這時不會進行新生代GC,而是改爲進行一次老年代GC(Full GC)
	
3,標記-整理算法
	概念:概念:首先標記出所有需要回收的對象,在標記完成後讓所有存活的對象都向一端移動,然後直接清理掉沒有存活對象的另一端。
	
4,分代收集算法
	Java堆分爲新生代和老年代,在新生代中採用 複製算法 回收,在老年代中使用 標記-清理 或 標記-整理 算法來回收
			
			

-----------------------------------------------------------------------
垃圾收集的3種策略(模式):
-----------------------------------------------------------------------				
Serial GC
	串行收集:適合內存有限的情況,回收慢。
Parallel GC
	並行收集:效率高,當Heap較大時,系統暫停時間較長。
CMS GC 
	併發收集:Old區回收暫停時間短,整個GC耗時較長、比較耗CPU資源。
		
			
			
			
					

 

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