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,標記-整理算法code

概念:概念:首先標記出全部須要回收的對象,在標記完成後讓全部存活的對象都向一端移動,而後直接清理掉沒有存活對象的另外一端。

4,分代收集算法orm

Java堆分爲新生代和老年代,在新生代中採用 複製算法 回收,在老年代中使用 標記-清理 或 標記-整理 算法來回收
相關文章
相關標籤/搜索