垃圾回收機(jī)制主要做以下兩件事情:
1跟蹤并監(jiān)控每個(gè)java對象,當(dāng)一個(gè)對象處于不可達(dá)狀態(tài)時(shí)候,回收該對象所占用的內(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對象的狀態(tài),因此當(dāng)一個(gè)對象失去引用時(shí)候憾赁,它不會立即被垃圾回收污朽,而是等垃圾回收運(yùn)行時(shí)才去回收。
對于一個(gè)垃圾回收的設(shè)計(jì)算法來說可如下:
- 串行回收和并行回收
串行回收就是不管系統(tǒng)有多少個(gè)CPU龙考,只使用一個(gè)CPU來執(zhí)行垃圾回收操作蟆肆,而并行回收就是把整個(gè)回收工作拆分成多部分,每個(gè)部分有一個(gè)CPU負(fù)責(zé)晦款,從而讓多個(gè)CPU并行回收炎功,并行回收的效率很高,但復(fù)雜度增加缓溅,內(nèi)存碎片也會增多蛇损。 - 并發(fā)執(zhí)行和應(yīng)用程序停止 ,應(yīng)用程序停止的垃圾回收方式在垃圾回收時(shí)候會讓程序暫停肛宋,并發(fā)執(zhí)行的垃圾回收雖然不會導(dǎo)致程暫停州藕, 但由于并發(fā) 垃圾回收需要解決和應(yīng)用程序的執(zhí)行沖突(應(yīng)用程序可能會在垃圾回收的時(shí)候修改對象)因此并發(fā)執(zhí)行垃圾回收的系統(tǒng)開銷比應(yīng)用程序停止的垃圾回收更高束世。而且執(zhí)行時(shí)候也需要更多的堆內(nèi)存酝陈。
- 壓縮和不壓縮和復(fù)制算法 為了減少內(nèi)存碎片,支持壓縮的垃圾回收器會把所有的活的對象搬遷到一起毁涉,然后將之前占用內(nèi)存 全部收回沉帮。不壓縮的回收只是回收內(nèi)存 這樣回收的內(nèi)存不可能是連續(xù)的 因此會有很多的內(nèi)存碎片。較之壓縮回收贫堰,不壓縮式的回收只回收內(nèi)存塊穆壕,而分配內(nèi)存時(shí)候會更慢,而且無法解決內(nèi)存碎片的問題其屏,復(fù)制式垃圾回收會將所有可達(dá)對象復(fù)制到另一塊相同的內(nèi)存中喇勋,這種方式的優(yōu)點(diǎn)是垃圾回收過程不會產(chǎn)生內(nèi)存碎片,但缺點(diǎn)也很明顯偎行,需要復(fù)制數(shù)據(jù)和額外的內(nèi)存川背。