垃圾回收機(jī)制主要做以下兩件事情:
1跟蹤并監(jiān)控每個(gè)java對(duì)象,當(dāng)一個(gè)對(duì)象處于不可達(dá)狀態(tài)時(shí)候,回收該對(duì)象所占用的內(nèi)存
2清理內(nèi)存分配,回收過程中產(chǎn)生的碎片
垃圾回收機(jī)制需要完成這兩方面的工作,而這兩方面的工作量都不算太小,因此垃圾回收算法就成為限制java程序運(yùn)行效率的重要因素。實(shí)現(xiàn)高效JVM的一個(gè)重要方面就是提供高效的垃圾回收機(jī)制,高效的垃圾回收機(jī)制既能保證垃圾回收的快速運(yùn)行避免內(nèi)存的分配和回收成為應(yīng)用程序的性能瓶頸,又不能導(dǎo)致應(yīng)用程序的停頓。
垃圾回收的基本算法
實(shí)際上垃圾回收算法不可能實(shí)時(shí)的檢測到j(luò)ava對(duì)象的狀態(tài),因此當(dāng)一個(gè)對(duì)象失去引用時(shí)候,它不會(huì)立即被垃圾回收,而是等垃圾回收運(yùn)行時(shí)才去回收。
對(duì)于一個(gè)垃圾回收的設(shè)計(jì)算法來說可如下:
- 串行回收和并行回收
串行回收就是不管系統(tǒng)有多少個(gè)CPU,只使用一個(gè)CPU來執(zhí)行垃圾回收操作,而并行回收就是把整個(gè)回收工作拆分成多部分,每個(gè)部分有一個(gè)CPU負(fù)責(zé),從而讓多個(gè)CPU并行回收,并行回收的效率很高,但復(fù)雜度增加,內(nèi)存碎片也會(huì)增多。 - 并發(fā)執(zhí)行和應(yīng)用程序停止 ,應(yīng)用程序停止的垃圾回收方式在垃圾回收時(shí)候會(huì)讓程序暫停,并發(fā)執(zhí)行的垃圾回收雖然不會(huì)導(dǎo)致程暫停, 但由于并發(fā) 垃圾回收需要解決和應(yīng)用程序的執(zhí)行沖突(應(yīng)用程序可能會(huì)在垃圾回收的時(shí)候修改對(duì)象)因此并發(fā)執(zhí)行垃圾回收的系統(tǒng)開銷比應(yīng)用程序停止的垃圾回收更高。而且執(zhí)行時(shí)候也需要更多的堆內(nèi)存。
- 壓縮和不壓縮和復(fù)制算法 為了減少內(nèi)存碎片,支持壓縮的垃圾回收器會(huì)把所有的活的對(duì)象搬遷到一起,然后將之前占用內(nèi)存 全部收回。不壓縮的回收只是回收內(nèi)存 這樣回收的內(nèi)存不可能是連續(xù)的 因此會(huì)有很多的內(nèi)存碎片。較之壓縮回收,不壓縮式的回收只回收內(nèi)存塊,而分配內(nèi)存時(shí)候會(huì)更慢,而且無法解決內(nèi)存碎片的問題,復(fù)制式垃圾回收會(huì)將所有可達(dá)對(duì)象復(fù)制到另一塊相同的內(nèi)存中,這種方式的優(yōu)點(diǎn)是垃圾回收過程不會(huì)產(chǎn)生內(nèi)存碎片,但缺點(diǎn)也很明顯,需要復(fù)制數(shù)據(jù)和額外的內(nèi)存。