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

python語言開發(fā)垃圾回收機(jī)制原理教程

 更新時間:2021年11月01日 14:27:20   作者:FikL-09-19  
這篇文章主要為大家介紹了python語言開發(fā)垃圾回收機(jī)制原理的教程有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

一.什么是垃圾回收機(jī)制

垃圾回收機(jī)制(簡稱GC), 解釋器自帶的一種機(jī)制

它是一種動態(tài)存儲管理技術(shù),自動釋放不再被程序引用的對象所占用的內(nèi)存空間

二.為什么要有垃圾回收機(jī)制

程序的運(yùn)行過程中會申請大量的內(nèi)存空間

對于一些無用的空間如果不及時清理的話會導(dǎo)致內(nèi)存溢出(不夠用),程序就會崩潰

管理內(nèi)存是非常復(fù)雜的事情,垃圾回收機(jī)制就把程序員從復(fù)雜的內(nèi)存管理中解放出啦

三.垃圾回收機(jī)制的原理

1.引用計數(shù)

引用計數(shù)就是變量名與變量值的關(guān)聯(lián)次數(shù), 以此來跟蹤和回收垃圾

直接引用

通過變量名直接引用

x = 18  #18被引用了一次,計數(shù)為1
y = x   #18被引用加1次,計數(shù)為2
z = y   #18被引用加1次,計數(shù)為3
print(id(x))  #140725488808736
print(id(y))  #140725488808736
print(id(z))  #140725488808736

間接引用

容器對其的引用都是間接

x = 18                 #18被引用一次,計數(shù)為1
li = [1,2,x]           #通過列表引用,計數(shù)加1,為2
dic = {'age': x}       #通過字典引用, 計數(shù)加1,為3
print(id(x))           #140725486514976
print(id(li[2]))       #140725486514976 列表引用,計數(shù)4
print(id(dic['age']))  #140725486514976 字典引用,計數(shù)5

2.棧區(qū) / 堆區(qū)

棧區(qū) : 存放的是變量名與變量值的內(nèi)存地址映射關(guān)系

堆區(qū) : 存放的是值真正的位置

在這里插入圖片描述

3.總結(jié)

直接引用指的是從棧區(qū)出發(fā)直接引用到的內(nèi)存地址

間接引用指的是從棧區(qū)出發(fā)引用到堆區(qū)后,再通過進(jìn)一步引用才能到達(dá)的內(nèi)存地址

四.標(biāo)記清除

1.循環(huán)引用問題(也叫交叉引用)

#我們先定義列表
l1=[0]  # 列表1被引用一次,列表1的引用計數(shù)變?yōu)?   
l2=[1]  # 列表2被引用一次,列表2的引用計數(shù)變?yōu)?   

#將列表加入另一個列表
l1.append(l2)  # 把列表2追加到l1中作為第二個元素,列表2的引用計數(shù)變?yōu)?
l2.append(l1)  # 把列表1追加到l2中作為第二個元素,列表1的引用計數(shù)變?yōu)?

#解除比變量名"l1"和"l2"與值的對應(yīng)關(guān)系
del l1
del l2

2.循環(huán)引用導(dǎo)致的結(jié)果

值不再被任何名字關(guān)聯(lián),但是值的引用計數(shù)并不會為0

應(yīng)該被回收但又不能被回收

3.解決方法 : 清除-標(biāo)記

容器對象的的引用都有可能產(chǎn)生循環(huán)引用, 而清除-標(biāo)記就是為解決這個問題的

當(dāng)應(yīng)用程序可用空間被耗盡時, 清除-標(biāo)記會停止整個程序, 然后先標(biāo)記, 再清除

  • 標(biāo)記
    但凡是可以從棧區(qū)出發(fā),找到對應(yīng)堆區(qū)內(nèi)容的(直接或間接引用)就標(biāo)記存活,非存活則清除
    具體點(diǎn):標(biāo)記的過程其實(shí)就是,遍歷所有的"GC Roots"對象(棧區(qū)中的所有內(nèi)容或者線程都可以作為"GC Roots"對象)
    然后將所有"GC Roots"的對象可以直接或間接訪問到的對象標(biāo)記為存活的對象,其余的均為非存活對象,應(yīng)該被清除
  • 清除
    遍歷堆中的對象,將沒有標(biāo)記存活的對象都清理掉

五.分代回收

1.效率問題

基于引用計數(shù)的回收機(jī)制,每次回收內(nèi)存,都需要把所有對象的引用計數(shù)都遍歷一遍

這是非常消耗時間的,于是引入了分代回收來提高回收效率

分代回收采用的是用**“空間換時間”**的策略。

2.解決方法 : 分代回收

分代

分代指的是根據(jù)變量的存活時間來劃分他們的等級
一個變量經(jīng)常被引用,等級(權(quán)重)就會提高,權(quán)重達(dá)到設(shè)定值就會進(jìn)入下一個等級
當(dāng)經(jīng)過多次掃描都沒有被回收,"GC機(jī)制"就會認(rèn)為該變量是常量
于是對其的掃描頻率會降低

在這里插入圖片描述

回收

當(dāng)計數(shù)降低,就容易被回收
分代回收可以起到提升效率的效果,但也存在一定的缺點(diǎn):
       比如一個變量剛從低等級轉(zhuǎn)入高等級,它就被解除了綁定關(guān)系
       它應(yīng)該被回收,但高等級掃描頻率低于低等級
       那么這個已被解除綁定關(guān)系的變量無法及時得到清理

總結(jié)

垃圾回收機(jī)制是在清理垃圾和釋放內(nèi)存的前提下
允許一些垃圾不被釋放為代價(就是等級權(quán)重高點(diǎn)的垃圾不會及時被清理)
以此換取引用計數(shù)掃描頻率的降低,從而提升其性能
這是一種以空間換時間的解決方案

以上就是python語言開發(fā)垃圾回收機(jī)制原理教程的詳細(xì)內(nèi)容,更多關(guān)于python語垃圾回收機(jī)制原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文教會你用python裁剪圖片

    一文教會你用python裁剪圖片

    Python語言的圖片處理使我們常常使用的方面,那么我們該如何實(shí)現(xiàn)圖片的剪切呢?下面這篇文章主要給大家介紹了關(guān)于用python裁剪圖片的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 關(guān)于jieba.cut與jieba.lcut的區(qū)別及說明

    關(guān)于jieba.cut與jieba.lcut的區(qū)別及說明

    這篇文章主要介紹了關(guān)于jieba.cut與jieba.lcut的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 如何用python多次調(diào)用exe文件運(yùn)行不同的結(jié)果

    如何用python多次調(diào)用exe文件運(yùn)行不同的結(jié)果

    有個C++項目是讀取配置參數(shù)文件并打印對應(yīng)的結(jié)果,后來需要多次修改配置文件并運(yùn)行,于是想到寫個python腳本執(zhí)行這一過程,今天通過本文給大家分享python多次調(diào)用exe文件運(yùn)行不同的結(jié)果,感興趣的朋友一起看看吧
    2023-05-05
  • 利用Python實(shí)現(xiàn)Picgo圖床工具

    利用Python實(shí)現(xiàn)Picgo圖床工具

    這篇文章主要介紹了如何利用Python實(shí)現(xiàn)Picgo圖床工具,PyPicGo?是一款圖床工具,是PicGo是Python版實(shí)現(xiàn),并支持各種插件自定義插件,目前PyPicGo自帶了gitee、github、SM.MS和七牛云圖傳,以及rename、notify和typora等插件,下面來看文章內(nèi)容介紹,需要的朋友可以參考一下
    2021-11-11
  • python實(shí)現(xiàn)xlwt xlrd 指定條件給excel行添加顏色

    python實(shí)現(xiàn)xlwt xlrd 指定條件給excel行添加顏色

    這篇文章主要介紹了python實(shí)現(xiàn)xlwt xlrd 指定條件給excel行添加顏色,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 在python中按照特定順序訪問字典的方法詳解

    在python中按照特定順序訪問字典的方法詳解

    今天小編就為大家分享一篇在python中按照特定順序訪問字典的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • django-rest-framework解析請求參數(shù)過程詳解

    django-rest-framework解析請求參數(shù)過程詳解

    這篇文章主要介紹了django-rest-framework解析請求參數(shù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python實(shí)現(xiàn)多腳本處理定時運(yùn)行

    Python實(shí)現(xiàn)多腳本處理定時運(yùn)行

    這篇文章主要介紹了Python實(shí)現(xiàn)多腳本處理定時運(yùn)行,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • Python實(shí)現(xiàn)按逗號分隔列表的方法

    Python實(shí)現(xiàn)按逗號分隔列表的方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)按逗號分隔列表的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • pandas使用之寬表變窄表的實(shí)現(xiàn)

    pandas使用之寬表變窄表的實(shí)現(xiàn)

    這篇文章主要介紹了pandas使用之寬表變窄表的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論