python中的垃圾回收机制_python里面的垃圾回收机制
1、引用計數機制:
python里每一個東西都是對象,它們的核心就是一個結構體:PyObject
typedef struct_object {
int ob_refcnt; #引用計數
struct_typeobject *ob_type;
} PyObject;
PyObject是每個對象必有的內容,其中ob_refcnt就是做為引用計數。當一個對象有新的引用時,它的ob_refcnt就會增加,當引用它的對象被刪除,它的ob_refcnt就會減少
#define Py_INCREF(op) ((op)->ob_refcnt++) //增加計數#define Py_DECREF(op) \ //減少計數
if (--(op)->ob_refcnt !=0) \
; \else\__Py_Dealloc((PyObject *)(op))
importsysclassA(object):def __init__(self):"""初始化對象"""
print ('object born id:%s'%str(hex(id(self))))deff1():"""循環引用變量與刪除變量"""
whileTrue:
c1=A()delc1deffunc(c):"""getrefcount() 返回對象的引用計數"""
print ('object refcount is:',sys.getrefcount(c))if __name__=='__main__':#生成對象
a=A()
func(a)#增強引用
b=a
func(a)#銷毀引用
delb
func(a)
結果:
object born id:0x1043059b0object refcountis: 4object refcountis: 5object refcountis: 4
gc方式1:引用計數
若此對象無其他對象引用,則立馬回收掉
優點:簡單、實時(將處理垃圾時間分攤到運行代碼時,而不是等到一次回收)
缺點:
1.保存對象引用數會占用一點點內存空間
2.每次執行語句都可能更新引用數,不再使用大的數據結構時,會引起大量對象被回收
3.不能處理循環引用的情況
gc方式2:標記-清除(Mark—Sweep)
此方式主要用來處理循環引用的情況,只有容器對象(list、dict、tuple,instance)才會出現循環引用的情況
處理過程1.將所有容器對象放到一個雙向鏈表中(鏈表為了方便插入刪除),這些對象為0代
2.循環遍歷鏈表,如果被本鏈表內的對象引入,自身的被引用數-1,如果被引用數為0,則觸發引用計數回收條件,被回收掉
3.未被回收的對象,升級為1代
『標記清除(Mark—Sweep)』算法是一種基于追蹤回收(tracing GC)技術實現的垃圾回收算法。它分為兩個階段:第一階段是標記階段,GC會把所有的『活動對象』打上標記,第二階段是把那些沒有標記的對象『非活動對象』進行回收。那么GC又是如何判斷哪些是活動對象哪些是非活動對象的呢?
對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關系構成這個有向圖的邊。從根對象(root object)出發,沿著有向邊遍歷對象,可達的(reachable)對象標記為活動對象,不可達的對象就是要被清除的非活動對象。根對象就是全局變量、調用棧、寄存器。
何時觸發
1.被引用為0時,立即回收當前對象
2.達到了垃圾回收的閾值,觸發標記-清除
3.手動調用gc.collect()
4.Python虛擬機退出的時候
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python中的垃圾回收机制_python里面的垃圾回收机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: net空间一次购买终身使用_官方解答关于
- 下一篇: python pip全称_“ pip i