日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python中的垃圾回收机制_python里面的垃圾回收机制

發(fā)布時(shí)間:2023/12/19 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的垃圾回收机制_python里面的垃圾回收机制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、引用計(jì)數(shù)機(jī)制:

python里每一個(gè)東西都是對(duì)象,它們的核心就是一個(gè)結(jié)構(gòu)體:PyObject

typedef struct_object {

int ob_refcnt; #引用計(jì)數(shù)

struct_typeobject *ob_type;

} PyObject;

PyObject是每個(gè)對(duì)象必有的內(nèi)容,其中ob_refcnt就是做為引用計(jì)數(shù)。當(dāng)一個(gè)對(duì)象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對(duì)象被刪除,它的ob_refcnt就會(huì)減少

#define Py_INCREF(op) ((op)->ob_refcnt++) //增加計(jì)數(shù)#define Py_DECREF(op) \ //減少計(jì)數(shù)

if (--(op)->ob_refcnt !=0) \

; \else\__Py_Dealloc((PyObject *)(op))

importsysclassA(object):def __init__(self):"""初始化對(duì)象"""

print ('object born id:%s'%str(hex(id(self))))deff1():"""循環(huán)引用變量與刪除變量"""

whileTrue:

c1=A()delc1deffunc(c):"""getrefcount() 返回對(duì)象的引用計(jì)數(shù)"""

print ('object refcount is:',sys.getrefcount(c))if __name__=='__main__':#生成對(duì)象

a=A()

func(a)#增強(qiáng)引用

b=a

func(a)#銷毀引用

delb

func(a)

結(jié)果:

object born id:0x1043059b0object refcountis: 4object refcountis: 5object refcountis: 4

gc方式1:引用計(jì)數(shù)

若此對(duì)象無其他對(duì)象引用,則立馬回收掉

優(yōu)點(diǎn):簡(jiǎn)單、實(shí)時(shí)(將處理垃圾時(shí)間分?jǐn)偟竭\(yùn)行代碼時(shí),而不是等到一次回收)

缺點(diǎn):

1.保存對(duì)象引用數(shù)會(huì)占用一點(diǎn)點(diǎn)內(nèi)存空間

2.每次執(zhí)行語句都可能更新引用數(shù),不再使用大的數(shù)據(jù)結(jié)構(gòu)時(shí),會(huì)引起大量對(duì)象被回收

3.不能處理循環(huán)引用的情況

gc方式2:標(biāo)記-清除(Mark—Sweep)

此方式主要用來處理循環(huán)引用的情況,只有容器對(duì)象(list、dict、tuple,instance)才會(huì)出現(xiàn)循環(huán)引用的情況

處理過程1.將所有容器對(duì)象放到一個(gè)雙向鏈表中(鏈表為了方便插入刪除),這些對(duì)象為0代

2.循環(huán)遍歷鏈表,如果被本鏈表內(nèi)的對(duì)象引入,自身的被引用數(shù)-1,如果被引用數(shù)為0,則觸發(fā)引用計(jì)數(shù)回收條件,被回收掉

3.未被回收的對(duì)象,升級(jí)為1代

『標(biāo)記清除(Mark—Sweep)』算法是一種基于追蹤回收(tracing GC)技術(shù)實(shí)現(xiàn)的垃圾回收算法。它分為兩個(gè)階段:第一階段是標(biāo)記階段,GC會(huì)把所有的『活動(dòng)對(duì)象』打上標(biāo)記,第二階段是把那些沒有標(biāo)記的對(duì)象『非活動(dòng)對(duì)象』進(jìn)行回收。那么GC又是如何判斷哪些是活動(dòng)對(duì)象哪些是非活動(dòng)對(duì)象的呢?

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

何時(shí)觸發(fā)

1.被引用為0時(shí),立即回收當(dāng)前對(duì)象

2.達(dá)到了垃圾回收的閾值,觸發(fā)標(biāo)記-清除

3.手動(dòng)調(diào)用gc.collect()

4.Python虛擬機(jī)退出的時(shí)候

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的python中的垃圾回收机制_python里面的垃圾回收机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。