在Java中,標(biāo)記整理和標(biāo)記復(fù)制都是兩種垃圾收集算法。垃圾收集是Java語言的一個重要特性,不僅簡化了內(nèi)存管理過程,還大大提高了程序運(yùn)行效率。
標(biāo)記整理算法是先標(biāo)記出所有的存活對象,然后將它們整理到一起,以便利用碎片化的內(nèi)存空間。該算法通過移動存活對象,使內(nèi)存空間連續(xù)(也即不會出現(xiàn)內(nèi)存碎片),便于后續(xù)內(nèi)存分配和回收。
public class MarkSweepGC { public static void main(String[] args) { Object obj; for (int i = 0; i< 1000000; i++) { obj = new Object(); } } }
上述代碼演示了標(biāo)記整理算法的工作原理,通過創(chuàng)建一個對象并循環(huán)執(zhí)行一百萬次,這些對象將被逐漸標(biāo)記為活躍對象,并重新排列在一起。
標(biāo)記復(fù)制算法與標(biāo)記整理算法類似,同樣先對存活對象進(jìn)行標(biāo)記,然后將它們復(fù)制到一個新的空間。標(biāo)記復(fù)制算法使用了兩個相等的內(nèi)存空間,一旦一個空間被占滿,就將存活對象復(fù)制到另一個空間并進(jìn)行對調(diào),同時將舊空間全部清空。
public class CopyingGC { public static void main(String[] args) { Object obj; for (int i = 0; i< 1000000; i++) { obj = new Object(); } } }
上述代碼演示了標(biāo)記復(fù)制算法的工作原理,與標(biāo)記整理算法相似,通過創(chuàng)建一個對象并循環(huán)執(zhí)行一百萬次,這些對象將被逐漸標(biāo)記為活躍對象,并被復(fù)制到相等的內(nèi)存空間中。
標(biāo)記整理算法和標(biāo)記復(fù)制算法都有自己的適用場景,程序員需要結(jié)合實(shí)際需求選擇適合的垃圾收集算法來優(yōu)化程序性能。