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

歡迎訪問 生活随笔!

生活随笔

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

python

python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解

發(fā)布時間:2023/12/20 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python内存管理机制错误_Python内存管理机制和垃圾回收机制的简单理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、內(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)容,希望文章能夠幫你解決所遇到的問題。

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