1.常用垃圾回收機(jī)制#
引用計數(shù)是一種簡單單速度很慢的垃圾回收機(jī)制拟淮。每個對象含有一個引用計數(shù)器,當(dāng)有引用連接至對象時谴忧,引用計數(shù)加1很泊。當(dāng)引用離開作用域或被置空時,引用計數(shù)減1沾谓。當(dāng)垃圾回收器在列表中遍歷時委造,發(fā)現(xiàn)某個對象的引用計數(shù)為0,就釋放其占用的空間均驶。例如python中:
num1 = 1
num2 = 1
print id(num1)
print id(num2)
//此時兩個值的id相同
上例說明1本身是一個對象,num1和num2都是這個對象的引用昏兆,既是指向同一個對象的兩個別名。
2.Java虛擬機(jī)的垃圾回收機(jī)制#
JAVA的GC實(shí)現(xiàn)了一種自適應(yīng)的方式妇穴。根據(jù)當(dāng)前情況爬虱,如果停止-復(fù)制后回收的垃圾很少則切換為標(biāo)記-清掃方式隶债,反之如果標(biāo)記-清掃后垃圾很多則切換為停止-復(fù)制模式。JAVA垃圾回收并不是隨時進(jìn)行跑筝,只有在內(nèi)存不足時才會執(zhí)行死讹,因?yàn)槔厥毡旧硎且豁?xiàng)很耗費(fèi)資源的操作。
2.1停止-復(fù)制##
通過在兩個堆上來回復(fù)制存活對象實(shí)現(xiàn)曲梗。首先運(yùn)行的JAVA程序?qū)粫和;乩珿C掃描原有堆中的存活對象,拷貝的新堆中稀并,一方面移除了非存活對象,另一方面緊湊了內(nèi)存中的對象单默。但是這種方式開銷較大碘举,在垃圾對象很少的時候會浪費(fèi)資源,所以當(dāng)一次停止-復(fù)制之后檢測到回收垃圾較少搁廓,GC會切換到標(biāo)記-清掃模式引颈。
2.2標(biāo)記-清掃##
通過掃描堆上的每個對象,如果已經(jīng)為存活對象則標(biāo)記境蜕,第二次掃描是清掃非存活對象蝙场,但是不做緊湊操作,是一種原地操作粱年。當(dāng)一次標(biāo)記-清掃之后發(fā)現(xiàn)存在大量垃圾對象則GC將切換到停止-復(fù)制模式售滤。