亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python的垃圾回收機制詳解

 更新時間:2019年08月28日 14:20:59   作者:Jeemzz  
這篇文章主要介紹了Python的垃圾回收機制詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

引用計數(shù)

在Python源碼中,每一個對象都是一個結(jié)構(gòu)體表示,都有一個計數(shù)字段。

typedef struct_object {
  int ob_refcnt;
  struct_typeobject *ob_type;
} PyObject;

PyObject是每個對象必有的內(nèi)容,其中ob_refcnt就是作為引用計數(shù)。當(dāng)一個對象有了新的引用時,它的ob_refcnt就會增加,引用它的對象被刪除時則減少。一旦對象的引用計數(shù)為0,該對象立即被回收,占用空間就會被釋放。

優(yōu)點

  • 簡單易用
  • 實時性好,一旦沒有引用就會被立即釋放

缺點

  • 需要額外空間去維護引用計數(shù)
  • 不能解決對象的循環(huán)引用

對象的循環(huán)引用
循環(huán)引用是指兩個對象相互引用且沒有外部變量引用其中任何一個,導(dǎo)致引用鏈形成一個環(huán)。

>>> a = {}    # 對象a的引用計數(shù)為1
>>> b = {}    # 對象b的引用計數(shù)為1
>>> a['b'] = b  # b的引用計數(shù)增加1
>>> b['a'] = a  # a的引用計數(shù)增加1
>>> del a     # a的引用計數(shù)減少1,最后a的引用為1
>>> del b     # b的引用計數(shù)減少1,最后b的引用為1

在執(zhí)行完del操作之后,沒有任何引用指向a、b對象,但是由于這兩個對象各自包含一個對對方的引用,所以引用計數(shù)始終保持在1。

按照引用計數(shù)中內(nèi)存回收的原理,由于a和b的計數(shù)不為0,所以在使用引用計數(shù)法進行內(nèi)存管理的時候這兩個對象不會被回收,它們會一直駐留在內(nèi)存中,造成內(nèi)存泄露。

標(biāo)記清除

標(biāo)記清除機制主要用于解決循環(huán)引用問題。

標(biāo)記清除算法是一種基于追蹤回收(tracing GC)技術(shù)實現(xiàn)的垃圾回收算法。主要分為兩個階段:

  • 標(biāo)記階段,GC會將所有的活動對象打上標(biāo)記
  • 對那些沒有打上標(biāo)記的非活動對象進行回收

區(qū)分活動對象與非活動對象

對象之間通過引用即指針連接在一起,構(gòu)成一個有向圖,對象就是這個有向圖的節(jié)點,而引用關(guān)系構(gòu)成這個有向圖的邊。從根對象(root object)出發(fā),沿著有向邊遍歷對象,可達的對象會被標(biāo)記為活動對象,不可達的對象就是要被清除的非活動對象。

根對象一般是全局變量、調(diào)用棧、寄存器等。

適用范圍

標(biāo)記清除算法作為Python輔助的垃圾收集技術(shù),主要處理的是容器對象,因為對于字符串、數(shù)值對象等,不可能造成循環(huán)引用的問題,Python會使用一個雙向鏈表將這些容器對象組織起來。

對于標(biāo)記清除算法來說,有一個比較明顯的缺點:為了清除非活動對象,需要掃描整個堆內(nèi)存,哪怕只剩下小部分活動對象也需要掃描所有對象。

分代回收

分代回收是一種以空間換時間的操作方式,建立在標(biāo)記清除技術(shù)的基礎(chǔ)之上,也是Python輔助的垃圾收集技術(shù),主要用于處理容器對象。

Python會將內(nèi)存根據(jù)對象的存活時間劃分為不同的集合,每個集合稱為一個代,主要會被分為3代:年輕代。中年代和老年代,它們會對應(yīng)3個鏈表,對應(yīng)的垃圾收集頻率隨著對象存活時間的增大而減小。

新創(chuàng)建的對象都會被分配在年輕代,當(dāng)年輕代鏈表總數(shù)達到上限時,會觸發(fā)Python的垃圾回收機制,對可回收對象進行回收,而那些不可回收的對象會被移到中年代去。依此類推,老年代對象是存活時間最久的對象,甚至有可能存活在整個系統(tǒng)的生命周期內(nèi)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python迭代器和生成器介紹

    Python迭代器和生成器介紹

    這篇文章主要介紹了Python迭代器和生成器介紹,本文分別用代碼實例講解了Python的迭代器和生成器,需要的朋友可以參考下
    2015-03-03
  • Python實現(xiàn)優(yōu)雅編寫LaTeX的示例代碼

    Python實現(xiàn)優(yōu)雅編寫LaTeX的示例代碼

    LaTeX?是一種廣泛用于排版學(xué)術(shù)論文、報告、書籍和演示文稿的標(biāo)記語言,本文主要為大家詳細介紹了如何使用?Python?來優(yōu)雅地編寫?LaTeX,提高效率并減少錯誤,需要的可以參考下
    2024-02-02
  • python更加靈活的Logger日志詳解

    python更加靈活的Logger日志詳解

    這篇文章主要介紹了python Logger日志,用到的4個類,針對每個知識點給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Python知識之列表的十個小技巧分享

    Python知識之列表的十個小技巧分享

    這篇文章主要介紹了Python知識之列表的十個小技巧分享,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python實現(xiàn)連通域標(biāo)記算法

    Python實現(xiàn)連通域標(biāo)記算法

    如果把圖像分為前景和背景兩部分,那么連通域就是連通在一起的前景,這種關(guān)系對于二值圖像來說比較明顯,下面我們就來了解一下連通域標(biāo)記算法原理及其Python實現(xiàn)吧
    2023-12-12
  • 解決python路徑錯誤,運行.py文件,找不到路徑的問題

    解決python路徑錯誤,運行.py文件,找不到路徑的問題

    這篇文章主要介紹了解決python路徑錯誤,運行.py文件,找不到路徑的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python自定義進程池實例分析【生產(chǎn)者、消費者模型問題】

    Python自定義進程池實例分析【生產(chǎn)者、消費者模型問題】

    這篇文章主要介紹了Python自定義進程池,結(jié)合實例分析了Python使用自定義進程池實現(xiàn)的生產(chǎn)者、消費者模型問題,需要的朋友可以參考下
    2016-09-09
  • Python Opencv實戰(zhàn)之文字檢測OCR

    Python Opencv實戰(zhàn)之文字檢測OCR

    這篇文章主要為大家詳細介紹了如何利用Python Opencv實現(xiàn)文字檢測OCR功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-08-08
  • Python爬蟲獲取頁面所有URL鏈接過程詳解

    Python爬蟲獲取頁面所有URL鏈接過程詳解

    這篇文章主要介紹了Python爬蟲獲取頁面所有URL鏈接過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Python中xml和json格式相互轉(zhuǎn)換操作示例

    Python中xml和json格式相互轉(zhuǎn)換操作示例

    這篇文章主要介紹了Python中xml和json格式相互轉(zhuǎn)換操作,結(jié)合實例形式分析了xmltodict庫的安裝及xml格式與json格式數(shù)據(jù)相互轉(zhuǎn)換操作技巧,需要的朋友可以參考下
    2018-12-12

最新評論