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