垃圾回收的基本原理:
1. 標(biāo)記-清除(Mark and Sweep):
這是最常見的垃圾回收算法之一惩激。它分為兩個(gè)階段:
標(biāo)記階段:從根對(duì)象出發(fā),標(biāo)記所有能夠被訪問到的對(duì)象包归。
清除階段:清除所有未被標(biāo)記的對(duì)象峰弹,釋放其占用的內(nèi)存空間。
2. 引用計(jì)數(shù)(Reference Counting):
這個(gè)方法是跟蹤記錄每個(gè)對(duì)象被引用的次數(shù)翘紊。當(dāng)引用次數(shù)變?yōu)?時(shí),說明該對(duì)象不再被引用藐唠,可以被回收帆疟。
但是引用計(jì)數(shù)無法解決循環(huán)引用的問題,即兩個(gè)或多個(gè)對(duì)象互相引用宇立,導(dǎo)致它們的引用計(jì)數(shù)永遠(yuǎn)不會(huì)變?yōu)?踪宠,從而無法被回收。
JavaScript中的垃圾回收:
標(biāo)記-清除算法:
JavaScript引擎會(huì)定期執(zhí)行垃圾回收妈嘹,標(biāo)記所有的活動(dòng)對(duì)象柳琢,然后清除未被標(biāo)記的對(duì)象。
分代回收(Generational Collection):
將對(duì)象根據(jù)其存活時(shí)間分為不同的代润脸。新創(chuàng)建的對(duì)象在新生代中柬脸,經(jīng)過多次垃圾回收后若仍存活,則會(huì)被移到老生代毙驯。
這樣可以根據(jù)對(duì)象的生命周期采用不同的回收策略倒堕,提高垃圾回收效率。
增量回收(Incremental Collection):
將垃圾回收過程分解為多個(gè)小步驟執(zhí)行爆价,可以在用戶代碼執(zhí)行期間逐步進(jìn)行垃圾回收垦巴,減少回收造成的停頓時(shí)間。
空間分配(Allocation):
JavaScript引擎通常使用堆來分配內(nèi)存空間铭段,當(dāng)需要?jiǎng)?chuàng)建新的對(duì)象時(shí)骤宣,會(huì)在堆中分配內(nèi)存空間。
優(yōu)化技術(shù):
引擎會(huì)盡可能地優(yōu)化垃圾回收算法和策略序愚,以提高性能和降低內(nèi)存占用憔披。
垃圾回收的優(yōu)勢:
方便: 無需手動(dòng)管理內(nèi)存,減少了程序員的工作量展运。
安全: 避免了內(nèi)存泄漏和野指針等內(nèi)存錯(cuò)誤活逆。
效率: 自動(dòng)回收不再使用的內(nèi)存精刷,減少了內(nèi)存碎片,提高了內(nèi)存利用