欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的垃圾回收機(jī)制詳解

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

引用計(jì)數(shù)

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

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

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

優(yōu)點(diǎn)

  • 簡(jiǎn)單易用
  • 實(shí)時(shí)性好,一旦沒(méi)有引用就會(huì)被立即釋放

缺點(diǎn)

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

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

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

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

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

標(biāo)記清除

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

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

  • 標(biāo)記階段,GC會(huì)將所有的活動(dòng)對(duì)象打上標(biāo)記
  • 對(duì)那些沒(méi)有打上標(biāo)記的非活動(dòng)對(duì)象進(jìn)行回收

區(qū)分活動(dòng)對(duì)象與非活動(dòng)對(duì)象

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

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

適用范圍

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

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

分代回收

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

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

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

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

相關(guān)文章

  • Python迭代器和生成器介紹

    Python迭代器和生成器介紹

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

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

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

    python更加靈活的Logger日志詳解

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

    Python知識(shí)之列表的十個(gè)小技巧分享

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

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

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

    解決python路徑錯(cuò)誤,運(yùn)行.py文件,找不到路徑的問(wèn)題

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

    Python自定義進(jìn)程池實(shí)例分析【生產(chǎn)者、消費(fèi)者模型問(wèn)題】

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

    Python Opencv實(shí)戰(zhàn)之文字檢測(cè)OCR

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

    Python爬蟲(chóng)獲取頁(yè)面所有URL鏈接過(guò)程詳解

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

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

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

最新評(píng)論