python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解
一、內(nèi)存管理機(jī)制
1.由c開發(fā)出來的cpython
2.include / objests
3.需要下載python源碼包
4.Pyobject:float
PyVarObject:
5.在python中所有東西創(chuàng)建對象的時候,內(nèi)部都會存儲一個數(shù)據(jù)
// 維護(hù)雙向鏈表
struct _object *_ob_next;
struct _object *_ob_prev;
// 應(yīng)用計數(shù)器
Py_ssize_t ob_refcnt;
// 類型
struct _typeobject *ob_type;
如果是有多個元素組成的話,內(nèi)部會再多維護(hù)一個
Py_ssize_t ob_size; /* Number of items in variable part */
6.在創(chuàng)建對象時,如:
操作:
v = 0.3
源碼內(nèi)部:
a.開辟內(nèi)存
b.初始化
ob_fval=0.3
ob_type=float
ob_refcnt=1
c.將對象加入到雙向鏈表中 ref_chain
操作:
name = v
源碼內(nèi)部:
ob_refcnt+1
操作:
del v
源碼內(nèi)部:
ob_refcnt-1
操作:
def fun(arg):
print(123)
fun(name)
源碼內(nèi)部:
剛進(jìn)去:ob_refcnt+1
執(zhí)行完:ob_refcnt-1
操作:
del name
源碼內(nèi)部:
ob_refcnt-1
每次應(yīng)用計數(shù)器減一時,都會檢查是否為0,如果是0則認(rèn)為他是垃圾,就對它進(jìn)行回收
內(nèi)存管理機(jī)制
Python是由c語言開發(fā),操作都是基于底層的c語言實現(xiàn)的,Python中創(chuàng)建每個對象,內(nèi)部都會與c語言結(jié)構(gòu)體維護(hù)一些值
Pyobject
指針指向上面的數(shù)據(jù)
指針指向下面的數(shù)據(jù)
計數(shù)器
類型
PyVarObject
PyObject
容量個數(shù)
在創(chuàng)建對象時,每個對象至少內(nèi)部有四個值:雙向鏈表/ob_refcnt/ob_type,之后對內(nèi)存中的數(shù)據(jù)進(jìn)行初始化,初始化本質(zhì):引用計數(shù)器=1,賦值,然后將對象添加到雙向鏈表中,以后再有其他變量執(zhí)行這個內(nèi)存,則讓引用計數(shù)器+1,如果銷毀某個變量,則找到指向的內(nèi)存,將其引用計數(shù)器-1
引用計數(shù)器如果為零則進(jìn)行垃圾回收
在內(nèi)部可能存在緩存機(jī)制,例如:float/int/list,最開始不會真正銷毀,而是放在free_list的鏈表中,以后在創(chuàng)建同類型的數(shù)據(jù)時,會先去鏈表中取出對象,然后在對對象進(jìn)行初始化。
(float內(nèi)存管理中默認(rèn)緩存100個/list內(nèi)存管理中默認(rèn)緩存10個)
二、垃圾回收機(jī)制
引用計數(shù)器為主,標(biāo)記清楚和分代回收為輔
1.引用計數(shù)器
引用計數(shù)器同上內(nèi)存管理中的描述
引用計數(shù)器會出現(xiàn)循環(huán)引用
(1)
a = [1, 2]
b = [4, 5]
a.append(b) # a中的第三個元素指向b,b的計數(shù)器發(fā)生變化,變成2了
(2)
del a
del b
# 當(dāng)這種代碼特別多的時候,內(nèi)存的占用也會特別多,內(nèi)存占用特別多的時候會造成內(nèi)存泄漏(溢出)
2.標(biāo)記清除
標(biāo)記清除可以用來解決內(nèi)存泄漏的問題
針對那些容器類型的對象,在Python中會將他們單獨(dú)放到一個雙向鏈表中,做定期掃描,檢查是否有循環(huán)引用,如果有各自-1,如果-1之后等于0,則直接回收。
3.分代回收
為了減少對象的掃描,將沒有問題的對象讓他放到上一級的鏈表中,默認(rèn)下一級掃描10次上一級才掃描1次,一共有三代鏈表
總結(jié)
以上是生活随笔為你收集整理的python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apizza在chrome上安装apiz
- 下一篇: Python第十七课(面向对象基础)