python的回收机制_Python垃圾回收机制【人生苦短,我用python】-阿里云开发者社区...
現(xiàn)在的高級語言如java,c#等,都采用了垃圾收集機制,而不再是c,c++里用戶自己管理維護內(nèi)存的方式。自己管理內(nèi)存極其自由,可以任意申請內(nèi)存,但如同一把雙刃劍,為大量內(nèi)存泄露,懸空指針等bug埋下隱患。
對于一個字符串、列表、類甚至數(shù)值都是對象,且定位簡單易用的語言,自然不會讓用戶去處理如何分配回收內(nèi)存的問題。
python里也同java一樣采用了垃圾收集機制,不過不一樣的是:
python采用的是引用計數(shù)機制為主,標(biāo)記-清除和分代收集兩種機制為輔的策略
引用計數(shù)機制:
python里每一個東西都是對象,它們的核心就是一個結(jié)構(gòu)體:PyObject
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
PyObject是每個對象必有的內(nèi)容,其中ob_refcnt就是做為引用計數(shù)。當(dāng)一個對象有新的引用時,它的ob_refcnt就會增加,當(dāng)引用它的對象被刪除,它的ob_refcnt就會減少。
#define Py_INCREF(op) ((op)->ob_refcnt++) //增加計數(shù)
#define Py_DECREF(op) \ //減少計數(shù)
if (--(op)->ob_refcnt != 0) \
; \
else \
__Py_Dealloc((PyObject *)(op))
當(dāng)引用計數(shù)為0時,該對象生命就結(jié)束了。
引用計數(shù)機制的優(yōu)點:
簡單
實時性
一旦沒有引用,內(nèi)存就直接釋放了。不用像其他機制等到特定時機。實時性還帶來一個好處:處理回收內(nèi)存的時間分攤到了平時。
引用計數(shù)機制的缺點:
維護引用計數(shù)消耗資源
循環(huán)引用
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)
list1與list2相互引用,如果不存在其他對象對它們的引用,list1與list2的引用計數(shù)也仍然為1,所占用的內(nèi)存永遠無法被回收,這將是致命的。
對于如今的強大硬件,缺點1尚可接受,但是循環(huán)引用導(dǎo)致內(nèi)存泄露,注定python還將引入新的回收機制。(標(biāo)記清除和分代收集)
總結(jié)
以上是生活随笔為你收集整理的python的回收机制_Python垃圾回收机制【人生苦短,我用python】-阿里云开发者社区...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 连通域_连通域的原理与Py
- 下一篇: 贷款利息如何计算 怎么计算贷款利息