python中垃圾回收機制

python垃圾回收的三種方法

①引用計數

當一個對象的引用被建立或複製時,對象引用計數加一,當對象的引用被銷燬時 引用計       數減一
當對象的引用計數爲0時 就意味着對象已經沒有使用了,就能夠將其內存釋放掉

優勢:
實時性,任何內存,一旦沒有指向它的引用,就會被當即回收,而其餘的垃圾收集技   術必須在某種特殊條件下才能進行無效內存的回收。

缺點:
對象之間相互引用,每一個對象的引用都不會爲0,因此這些對象所佔用的內存始終都不會被釋放掉。
效率低

②標記-清除

一、標記-清除: 只關注那些可能會產生循環引用的對象
二、整型、字符串這些不可變對象是不可能產生循環引用的,由於它們內部不可能持有其它對象的引用。
三、Python中的循環引用老是發生在可變對象之間,也就是可以在內部持有其它對象的對象,好比list、dict、class等等。
四、因此該方法帶來的開銷只依賴於可變對象的的數量.
五、大白話:  把活躍對象作標記,把哪些沒有標記的都清除回收

優勢:
清除算法的優勢,那固然要數算法簡單,實現容易了。 
另外,若是算法實現簡單,那麼它與其餘算法的組合也就相應地簡單。

缺點:
標記和清除的過程效率不高
使用過程當中會逐漸產生被細化的分塊,不久後就會致使無數的 小分塊散佈在堆的各處。咱們稱這種情況爲碎片化(fragmentation)。

原理:
把全部能夠訪問到的對象打上標記,而後清掃一遍內存空間,把全部沒標記的對象釋放

③分代回收

將系統中的全部內存塊根據其存活時間劃分爲不一樣的集合,每個集合就成爲一個「代」,垃圾收集的頻率隨着「代」的存活時間的增大而減少。
也就是說,活得越長的對象,就越不多是垃圾,就應該減小對它的垃圾收集頻率。
那麼如何來衡量這個存活時間:一般是利用幾回垃圾收集動做來衡量,若是一個對象通過的垃圾收集次數越多,能夠得出:該對象存活時間就越長。

優勢:
吞吐量獲得改善
經過使用分代垃圾回收,能夠改善 GC 所花費的時間(吞吐量)。正如 Ungar 所說的那	樣:「據實驗代表,分代垃圾回收花費的時間是 GC 複製算法的 1/4。」可見分代垃圾 回收	的導入很是明顯地改善了吞吐量。
另外一方面,由於老年代 GC 很費時間,因此咱們無法縮短 mutator 的最大暫停時間。關 於使用分代垃圾回收來縮減 mutator 最大暫停時間的方法

缺點:
在部分程序中會起到副作用
對對象會活得好久的程序執行分代垃圾回收,就會產生如下兩個問題。
新生代GC所花費的時間增多
老年代GC頻繁運行
考慮到這兩點,恐怕咱們無法利用到分代垃圾回收的優勢,或者就算利用到了,效果	也 甚微。