簡單介紹python的垃圾回收機制

安全劍客發表於2020-10-12
這篇文章主要介紹了python垃圾回收機制的相關資料,幫助大家更好的理解和使用python,感興趣的朋友可以瞭解下
什麼是垃圾回收機制?

首先,我們先來解釋名詞,垃圾回收是不是就是將沒用的,廢棄的東西回收起來。

在坐的各位都沒有女朋友對吧,那難以想象你們的房間會是一個什麼樣子,可能會有很多垃圾,很凌亂,自己也不收拾。那當你有了女朋友了就不一樣了,她會幫你收拾房間,把沒用的垃圾都給你扔掉。

那在我們Python當中的垃圾回收承擔的就是女朋友的角色,你們想象一下,你現在有一個輕度強迫症的女朋友一刻不停的跟在你的背後打掃衛生,你一放下髒碟子或者垃圾什麼的,就已經幫你清理、打掃了

所以垃圾回收機制就是自動幫助我們管理記憶體,清理垃圾的一種工具

垃圾回收機制有什麼用?

那我們現在先來想一想,我們平時在寫程式的時候是不是會定義一些變數名,那這些變數名都是存在哪些地方呢?是不是都是存在記憶體裡面,那當我們一直不停的定義變數是不是就會使我們記憶體空間的佔有率增加,那我們的垃圾回收機制就會將一些沒用的名字,沒用的垃圾自動的回收起來。

識別垃圾物件,從垃圾物件那裡回收記憶體

怎麼進行垃圾回收

在我們Python當中採用的是引用計數機制為主,分代收集機制為輔的策略。

1、引用計數

在Python中,大多數物件的生命週期都是透過物件的引用計數來管理的。從廣義上來講,引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的垃圾收集技術。

引用計數的原理:

當一個物件的引用被建立或者複製時,物件的引用計數加1;

當一個物件的引用被銷燬時,物件的引用計數減1;

當物件的引用計數減少為0時,就意味著物件已經沒有被任何人使用了,可以將其所佔用的記憶體釋放了。

引用計數有一個致命的弱點就是是迴圈引用(也稱交叉應用)。

迴圈引用可以使一組物件的引用計數不為0,然而這些物件實際上並沒有被任何外部物件所引用,它們之間只是相互引用。

這意味著不會再有人使用這組物件,應該回收這組物件所佔用的記憶體空間,然後由於相互引用的存在,每一個物件的引用計數都不為0,因此這些物件所佔用的記憶體永遠不會被釋放。

優點:

簡單、直觀

實時性,只要沒有了引用就釋放資源。

缺點:

維護引用計數需要消耗一定的資源

迴圈應用時,無法回收。也正是因為這個原因,才需要透過標記-清理和分代收集機制來輔助引用計數機制。

2、標記-清除

“標記-清除”是為了解決迴圈引用的問題。可以包含其他物件引用的容器物件(比如:list,set,dict,class,instance)都可能產生迴圈引用。

標記-清除原理:

“標記-清除”不改動真實的引用計數,而是將集合中物件的引用計數複製一份副本,改動該物件引用的副本。對於副
本做任何的改動,都不會影響到物件生命走起的維護。

3、分代回收

分代回收原理:

將系統中的所有記憶體塊根據其存活時間劃分為不同的集合,每一個集合就成為一個“代”,垃圾收集的頻率隨著“代”的存活時間的增大而減小。

也就是說,活得越長的物件,就越不可能是垃圾,就應該減少對它的垃圾收集頻率。那麼如何來衡量這個存活時間:通常是利用幾次垃圾收集動作來衡量,如果一個物件經過的垃圾收集次數越多,可以得出:該物件存活時間就越長。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2726269/,如需轉載,請註明出處,否則將追究法律責任。

相關文章