標(biāo)記整理和復(fù)制算法的區(qū)別 java gc中為什么復(fù)制算法比標(biāo)記整理算法快?
java gc中為什么復(fù)制算法比標(biāo)記整理算法快?與復(fù)制算法相比,標(biāo)記排序算法和復(fù)制算法的主要區(qū)別在于是否需要一個(gè)空閑內(nèi)存區(qū)域來存儲幸存的對象。對于標(biāo)記排序算法,沒有可用內(nèi)存,需要按順序?qū)⑿掖鎸ο笠苿拥?/p>
java gc中為什么復(fù)制算法比標(biāo)記整理算法快?
與復(fù)制算法相比,標(biāo)記排序算法和復(fù)制算法的主要區(qū)別在于是否需要一個(gè)空閑內(nèi)存區(qū)域來存儲幸存的對象。
對于標(biāo)記排序算法,沒有可用內(nèi)存,需要按順序?qū)⑿掖鎸ο笠苿拥絻?nèi)存的一端。為了保證其他幸存對象的內(nèi)容在移動過程中不被覆蓋,需要在標(biāo)記期間根據(jù)內(nèi)存地址對其進(jìn)行排序。但是,復(fù)制算法并不關(guān)心幸存對象的內(nèi)存地址順序,只需要直接復(fù)制它們,所以復(fù)制算法比較標(biāo)記記住,排序算法要快一點(diǎn),但是需要更多的內(nèi)存。根據(jù)兩種算法的特點(diǎn)以及新一代存儲對象和老年存儲對象的特點(diǎn),分別采用了相應(yīng)的算法。
復(fù)制算法生存對象不關(guān)心存儲地址順序
標(biāo)記和整理算法需要根據(jù)對象的存儲順序移動
什么是GC
Java GC(垃圾收集,垃圾收集)機(jī)制是Java和C/C的主要區(qū)別之一。在使用Java時(shí),一般是無需編寫特殊的內(nèi)存收集和垃圾清理代碼。這是因?yàn)镴ava虛擬機(jī)中有自動內(nèi)存管理和垃圾清理機(jī)制。
2、關(guān)于GC的三種算法
1。復(fù)制算法:在JVM的堆內(nèi)存中,新一代使用復(fù)制算法。新一代人的記憶區(qū)域分為伊甸園、從和到三個(gè)區(qū)域。這三個(gè)區(qū)域的內(nèi)存占用率是8:1:1。新創(chuàng)建的對象存儲在Eden區(qū)域和from區(qū)域。當(dāng)整個(gè)兩個(gè)區(qū)域的內(nèi)存達(dá)到一定的占用時(shí),將執(zhí)行輕量級垃圾收集(minor GC),幸存對象將老化1,并將幸存對象復(fù)制到to區(qū)域。此時(shí),from區(qū)域和to區(qū)域被交換(區(qū)分from區(qū)域和to區(qū)域:誰是空的,誰是to,from區(qū)域和to區(qū)域被連續(xù)交換)。當(dāng)一個(gè)物體的年齡達(dá)到15歲時(shí),它就從新生代移到了老年。優(yōu)點(diǎn):無內(nèi)存碎片問題,能保持對象的完整性。缺點(diǎn):保持to區(qū)域?yàn)榭諘速M(fèi)一定的內(nèi)存空間。
2. 完全GC或主要GC:在過去,一般通過標(biāo)記清除或標(biāo)記清除和標(biāo)記排序的混合來實(shí)現(xiàn)。
(1)標(biāo)記掃描算法:標(biāo)記掃描步驟1:標(biāo)記:從根集掃描,標(biāo)記幸存對象步驟2:清除:再次掃描整個(gè)內(nèi)存空間,回收未標(biāo)記的對象,并使用空閑列表記錄可用區(qū)域。優(yōu)點(diǎn):兩次掃描,耗時(shí),會產(chǎn)生內(nèi)存碎片。缺點(diǎn):不需要額外的空間。
(2)標(biāo)記壓縮標(biāo)記/整理算法:標(biāo)記壓縮標(biāo)記/整理算法的唯一缺點(diǎn)是效率低下。它不僅可以標(biāo)記所有幸存對象,還可以整理出幸存對象的引用地址。在效率方面,標(biāo)記/排序算法低于復(fù)制算法]。3、 總結(jié)了三種算法的內(nèi)存效率:
復(fù)制算法>標(biāo)記清除算法>標(biāo)記排序算法。
內(nèi)存一致性:復(fù)制算法=標(biāo)記排序算法>標(biāo)記清除率