最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的垃圾回收(GC)機制

 更新時間:2020年09月21日 08:43:45   作者:蒂米  
這篇文章主要介紹了python中的GC機制,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

一、引用計數(shù)

Python 垃圾回收以引用計數(shù)為主,分代回收為輔。引用計數(shù)法的原理是每個對象維護一個ob_refcnt,用來記錄對象被引用的次數(shù),也就是用來追蹤有多少個引用指向了對象,當(dāng)發(fā)生以下四種情況的時候,對象的引用計數(shù)+1:

  • 對象被創(chuàng)建,比如:a = 14
  • 對象被引用,比如: b = a
  • 對象被作為參數(shù),傳給函數(shù),比如:func(a)
  • 對象作為容器中的一個元素,比如:List = {a, ”a” , ”b”, 2}

與上述情況相對應(yīng),當(dāng)發(fā)生以下四種情況時,對象的引用計數(shù)-1:

對象的別名被顯式銷毀,比如:del a
對象的別名被賦予新的對象,比如:a = 26
對象離開它的作用域,比如 func() 執(zhí)行完畢時,函數(shù)里面的所有局部變量的引用計數(shù)都會減 1
將元素從容器中刪除,或者容器被銷毀
當(dāng)對象的引用計數(shù)為 0 時,它將被 Python 虛擬機回收。

在 Python 中一切皆對象,它們的核心是 Py_Object 結(jié)構(gòu)體,所有 Python 對象的頭部都包含該結(jié)構(gòu):

// object.h
#define PyObject_HEAD   
 _PyObject_HEAD_EXTRA  
 Py_ssize_t ob_refcnt;  
 struct _typeobject *ob_type;
​
typedef struct _object {
 PyObject_HEAD
} PyObject;

比如 int 類型的定義如下:

// intobj.h
typedef struct {
 PyObject_HEAD
 long ob_ival;
} PyIntObject;

簡而言之,PyObject 是每個對象必有的內(nèi)容,其中 ob_refcnt 是對象的引用計數(shù)。對象有新的引用時,它的 ob_refcnt 會增加;當(dāng)對象的引用被刪除時,ob_refcnt 會減少。當(dāng)引用計數(shù)為 0 時,對象的生命周期就結(jié)束了。

// object.h
#define Py_INCREF(op) (    
 _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA 
 ((PyObject*)(op))->ob_refcnt++)
​
#define Py_DECREF(op)     
 do {      
 if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA 
 --((PyObject*)(op))->ob_refcnt != 0)  
  _Py_CHECK_REFCNT(op)   
 else      
 _Py_Dealloc((PyObject *)(op));   
 } while (0)

引用計數(shù)有很明顯的優(yōu)點:

  • 高效
  • 運行期沒有停頓,即實時性:對象一旦沒有引用,將直接被釋放。實時性還帶來一個好處是:處理回收內(nèi)存的時間分攤到了平時
  • 對象有確定的生命周期
  • 易于實現(xiàn)

原始的引用計數(shù)法也有明顯的缺點:

  • 維護引用計數(shù)消耗資源,維護引用計數(shù)的次數(shù)和引用賦值成正比
  • 無法解決循環(huán)引用的問題

比如:

list1 = []
list2 = []
list1.append(list2)
list2.append(list1)

為了解決這兩個致命弱點,Python 又引入了以下兩種 GC 機制。

二、標記-清除

『標記-清除(Mark-Sweep)』算法是一種基于追蹤回收(tracing GC)技術(shù)實現(xiàn)的垃圾回收算法。它分為兩個階段:第一階段是標記階段,GC 會給所有『活動對象』打上標記;第二階段是回收沒有標記的『非活動對象』。那么 GC 如何判斷哪些是活動對象、哪些是非活動對象呢?

對象之間通過引用(指針)連在一起,構(gòu)成一個有向圖。對象是有向圖的頂點,引用關(guān)系是有向圖的弧。從根對象(root object)出發(fā),遍歷有向圖,將可達的(reachable)對象標記為活動對象,不可達的對象就是要被清除的非活動對象。根對象是全局變量、調(diào)用棧、寄存器。

在上圖中,把小黑圈視為全局變量,也就是把它作為 root object,從小黑圈出發(fā),對象 1 可直達,那么它將被標記,對象 2、3 可間接到達,也會被標記,而 4 和 5 不可達,因此 1、2、3 是活動對象,4 和 5 是非活動對象,會被 GC 回收。

標記清除算法作為 Python 的輔助垃圾回收技術(shù),主要用于處理容器對象,比如 list、dict、tuple、instance 等,因為字符串、數(shù)值等原子類型的對象不可能造成循環(huán)引用問題。Python 使用雙向鏈表將容器對象組織起來。不過這種簡單粗暴的標記清除算法也有明顯的缺點:清除非活動對象前,必須順序掃描整個堆內(nèi)存,哪怕只剩下小部分非活動對象,也要掃描所有對象。

三,分代回收

分代回收是一種以空間換時間的操作方式,Python 將內(nèi)存根據(jù)對象的存活時間劃分為不同的集合,每個集合稱為一個代,Python 將內(nèi)存分為了 3 代,分別為年輕代(第 0 代)、中年代(第 1 代)、老年代(第 2 代),它們對應(yīng)是 3 個鏈表,垃圾回收頻率隨著對象存活時間的增大而減小。新創(chuàng)建的對象都會被分配到年輕代,當(dāng)年輕代鏈表的節(jié)點總數(shù)達到上限時,Python 垃圾收集機制就會被觸發(fā),把可以被回收的對象回收掉,而不能被回收的對象會被移到中年代去,依此類推,老年代中的對象是存活時間最久的對象,甚至存活于整個系統(tǒng)的生命周期內(nèi)。分代回收建立在標記清除的基礎(chǔ)之上,分代回收同樣作為 Python 處理容器對象的輔助垃圾回收技術(shù)。

以上就是python中的GC機制的詳細內(nèi)容,更多關(guān)于python GC的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • AUC計算方法與Python實現(xiàn)代碼

    AUC計算方法與Python實現(xiàn)代碼

    今天小編就為大家分享一篇AUC計算方法與Python實現(xiàn)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 完美解決jupyter由于無法import新包的問題

    完美解決jupyter由于無法import新包的問題

    這篇文章主要介紹了完美解決jupyter由于無法import新包的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python爬蟲中的url下載器用法詳解

    python爬蟲中的url下載器用法詳解

    在本篇內(nèi)容里小編給各位整理的是一篇關(guān)于python爬蟲中的url下載器用法詳解內(nèi)容,需要的朋友們參考下。
    2020-11-11
  • Pandas數(shù)據(jù)查詢的集中實現(xiàn)方法

    Pandas數(shù)據(jù)查詢的集中實現(xiàn)方法

    本文主要介紹了Pandas數(shù)據(jù)查詢的集中實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python實現(xiàn)的HMacMD5加密算法示例

    Python實現(xiàn)的HMacMD5加密算法示例

    這篇文章主要介紹了Python實現(xiàn)的HMacMD5加密算法,簡單說明了HMAC-MD5加密算法的概念、原理并結(jié)合實例形式分析了Python實現(xiàn)HMAC-MD5加密算法的相關(guān)操作技巧,,末尾還附帶了Java實現(xiàn)HMAC-MD5加密算法的示例,需要的朋友可以參考下
    2018-04-04
  • Python實現(xiàn)驗證碼識別

    Python實現(xiàn)驗證碼識別

    這篇文章主要介紹了Python實現(xiàn)驗證碼識別的方法,文中講解非常詳細,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Django實戰(zhàn)之用戶認證(初始配置)

    Django實戰(zhàn)之用戶認證(初始配置)

    這篇文章主要介紹了Django實戰(zhàn)之用戶認證(初始配置),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Python繪制堆疊柱狀圖的實例

    Python繪制堆疊柱狀圖的實例

    今天小編就為大家分享一篇Python繪制堆疊柱狀圖的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python爬蟲包BeautifulSoup實例(三)

    Python爬蟲包BeautifulSoup實例(三)

    這篇文章主要為大家詳細介紹了Python爬蟲包BeautifulSoup實例,具有一定的參考價值,感興趣的朋友可以參考一下
    2018-06-06
  • flask+pymysql實現(xiàn)Web端操作數(shù)據(jù)庫的項目實踐

    flask+pymysql實現(xiàn)Web端操作數(shù)據(jù)庫的項目實踐

    本文主要介紹了flask+pymysql實現(xiàn)Web端操作數(shù)據(jù)庫的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評論

丹东市| 玉山县| 东方市| 榆中县| 中西区| 凉山| 清流县| 楚雄市| 友谊县| 岑溪市| 东辽县| 清流县| 三明市| 肥城市| 大关县| 酒泉市| 喀喇沁旗| 宁化县| 河源市| 屏边| 吉隆县| 柞水县| 永顺县| 百色市| 城口县| 文登市| 河西区| 晴隆县| 漯河市| 成武县| 宿迁市| 弥渡县| 平阳县| 德保县| 乐亭县| 长葛市| 江口县| 海兴县| 奉化市| 南宁市| 濉溪县|