可達(dá)性分析算法
這個(gè)算法的基礎(chǔ)就是:有一系列的GC-Roots作為起始點(diǎn),從起始點(diǎn)向下搜索。所走過(guò)的路徑稱(chēng)為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈的時(shí)候,即說(shuō)明這個(gè)對(duì)象不可達(dá)的時(shí)候,則證明此對(duì)象是不可用的。
即使在可達(dá)性分析算法中不可達(dá)的對(duì)象,也并非是非死不可的,這時(shí)候他們處于緩刑階段,要真正宣告一個(gè)對(duì)象死亡,至少要經(jīng)歷兩次標(biāo)記過(guò)程:1)如果對(duì)象在可達(dá)性分析之后沒(méi)有發(fā)現(xiàn)與GC Roots 相連接的引用鏈,那么它將會(huì)被第一次標(biāo)記并進(jìn)行一次篩選:篩選的條件是該對(duì)象是否有必要執(zhí)行finalize()方法,當(dāng)對(duì)象沒(méi)有覆蓋finalize()方法,或者finalize()方法已經(jīng)被虛擬機(jī)棧調(diào)用過(guò),虛擬機(jī)將這兩種情況都視為沒(méi)有必要執(zhí)行。
如果被標(biāo)記為有必要執(zhí)行finalize()方法,那么這個(gè)對(duì)象將會(huì)被放在一個(gè)低優(yōu)先級(jí)的隊(duì)列F-Queue上,并稍后再一個(gè)虛擬機(jī)自動(dòng)建立的,低優(yōu)先級(jí)的Finalizer線程執(zhí)行它,這里所謂的執(zhí)行是指虛擬機(jī)會(huì)觸發(fā)這個(gè)方法,但并不承諾會(huì)等他運(yùn)行結(jié)束,因?yàn)槿绻幸粋€(gè)對(duì)象在finalize()方法中執(zhí)行緩慢,或者發(fā)生了死循環(huán),那么很可能導(dǎo)致F-Queue隊(duì)列中的其他對(duì)象處于永久等待中,對(duì)象要在finalize中成功拯救自己只需啊重新與任何一個(gè)對(duì)象關(guān)聯(lián)即可,譬如把自己賦值給某個(gè)對(duì)象或者成員變量即可。
垃圾收集算法
標(biāo)記清除算法
這個(gè)算法分為兩步一步是標(biāo)記,一部是清除。首先標(biāo)記出所有需要回收的對(duì)象,然后在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象。缺點(diǎn):效率不高,會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片。
復(fù)制算法(一般用于年輕代)
它將可用的內(nèi)存分為大小相同的兩塊,每次只使用其中一塊,當(dāng)一塊的內(nèi)存用完了,就將還活著的對(duì)象一次性的復(fù)制到另一塊上面,再把已使用的內(nèi)存一次性的清理掉。缺點(diǎn):將內(nèi)存變?yōu)樵瓉?lái)的一半。
標(biāo)記整理算法
將所有存活的對(duì)象向一段移動(dòng)
一般,我們將內(nèi)存分為一個(gè)Eden和兩個(gè)Survivor區(qū),有兩種收集方式:minorGC和FullGC。MinorGC指的是發(fā)生在新生代的垃圾收集動(dòng)作,因?yàn)镴ava對(duì)象大多都具有朝生夕滅的特性,發(fā)生的次數(shù)多,一般回收速度也快。
FullGC:(MajorGC/FullGC):指發(fā)生在老年代的GC,比一般的MinorGC慢至少十倍以上。
以下有一些規(guī)則:大對(duì)象直接進(jìn)入老年代,超過(guò)參數(shù)-XX:PretenureSizeThreshold參數(shù)的直接進(jìn)入到老年代,防止在兩個(gè)Survivor和一個(gè)Eden區(qū)之間發(fā)生大量的內(nèi)存復(fù)制。
長(zhǎng)期存活的對(duì)象直接進(jìn)入老年代,-XX:MaxTenuringThreshold=? 如果對(duì)象出生在Eden區(qū)中并且熬過(guò)了一次MinorGC之后并且能被Survivor容納的話,對(duì)象年齡就被設(shè)置為1,對(duì)象在Survivor區(qū)中每熬過(guò)一個(gè)MinorGC年齡就增加一歲,當(dāng)增加到一定程度就會(huì)直接進(jìn)入老年代。
動(dòng)態(tài)對(duì)象規(guī)則判定:如果在Survivor空間中相同年齡所有對(duì)象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對(duì)象就直接進(jìn)入老年代。
-Xms:堆大小的下限? ?-Xmx:堆大小的最大值? -Xmn新生代的內(nèi)存大小? ?-XX:SurvivorRatio=8 代表Eden與Survivor的比為8:1