Python GC主要使用引用計(jì)數(shù)(reference counting)來(lái)跟蹤和回收垃圾。在引用計(jì)數(shù)的基礎(chǔ)上,通過(guò)“標(biāo)記-清除”(mark and sweep)解決容器對(duì)象可能產(chǎn)生的循環(huán)引用問(wèn)題,通過(guò)“分代回收”(generation collection)以空間換時(shí)間的方法提高垃圾回收效率。
- 引用計(jì)數(shù)
PyObject是每個(gè)對(duì)象必有的內(nèi)容,其中ob_refcnt就是做為引用計(jì)數(shù)。當(dāng)一個(gè)對(duì)象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對(duì)象被刪除,它的ob_refcnt就會(huì)減少.引用計(jì)數(shù)為0時(shí),該對(duì)象生命就結(jié)束了。
優(yōu)點(diǎn):
1、簡(jiǎn)單
2、實(shí)時(shí)性
缺點(diǎn):
1、維護(hù)引用計(jì)數(shù)消耗資源
2、循環(huán)引用 - 標(biāo)記-清除機(jī)制
基本思路是先按需分配,等到?jīng)]有空閑內(nèi)存的時(shí)候從寄存器和程序棧上的引用出發(fā),遍歷以對(duì)象為節(jié)點(diǎn)、以引用為邊構(gòu)成的圖,把所有可以訪問(wèn)到的對(duì)象打上標(biāo)記,然后清掃一遍內(nèi)存空間,把所有沒(méi)標(biāo)記的對(duì)象釋放。 - 分代技術(shù)
分代回收的整體思想是:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時(shí)間劃分為不同的集合,每個(gè)集合就成為一個(gè)“代”,垃圾收集頻率隨著“代”的存活時(shí)間的增大而減小,存活時(shí)間通常利用經(jīng)過(guò)幾次垃圾回收來(lái)度量。
Python默認(rèn)定義了三代對(duì)象集合,索引數(shù)越大,對(duì)象存活時(shí)間越長(zhǎng)。
舉例:
當(dāng)某些內(nèi)存塊M經(jīng)過(guò)了3次垃圾收集的清洗之后還存活時(shí),我們就將內(nèi)存塊M劃到一個(gè)集合A中去,而新分配的內(nèi)存都劃分到集合B中去。當(dāng)垃圾收集開(kāi)始工作時(shí),大多數(shù)情況都只對(duì)集合B進(jìn)行垃圾回收,而對(duì)集合A進(jìn)行垃圾回收要隔相當(dāng)長(zhǎng)一段時(shí)間后才進(jìn)行,這就使得垃圾收集機(jī)制需要處理的內(nèi)存少了,效率自然就提高了。在這個(gè)過(guò)程中,集合B中的某些內(nèi)存塊由于存活時(shí)間長(zhǎng)而會(huì)被轉(zhuǎn)移到集合A中,當(dāng)然,集合A中實(shí)際上也存在一些垃圾,這些垃圾的回收會(huì)因?yàn)檫@種分代的機(jī)制而被延遲。