python 垃圾回收

小整数对象池
整数在程序中的使用非常广泛,Python为了 优化速度,使用了小整数对象池, 避免为整 数频繁申请和销毁内存空间。

Python 对小整数的定义是 [-5, 257) 这些整数 对象是提前建立好的,不会被垃圾回收。在 一个 Python 的程序中,所有位于这个范围内的整数使用的都是同一个对象。

同理,单个字母也是这样的。

但是当定义2个相同的字符串时,引用计数为 0,触发垃圾回收 。

大整数对象池
每一个大整数,均创建一个新的对象。
在这里插入图片描述

intern机制

a1 = "HelloWorld" 
a2 = "HelloWorld" 
a3 = "HelloWorld" 
a4 = "HelloWorld" 
a5 = "HelloWorld" 

python会不会创建5个对象呢,在内存中会不会开辟5个”HelloWorld”的内存空间 呢? 想一下,如果是这样的话,我们写10000个对象,比如 a1=”HelloWorld”…..a1000=”HelloWorld”, 那他岂不是开辟了1000 个”HelloWorld”所占的内存空间了呢?如果真这样,内存不就爆了吗?所以 python中有这样一个机制——intern机制,让他只占用一个”HelloWorld”所占的 内存空间。靠引用计数去维护何时释放。

总结 :
1、小整数[-5,257)共用对象,常驻内存
2、单个字符共用对象,常驻内存
3、单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁

含有空格和不含空格字符串的区别
字符串(含有空格),不可修改,没开启intern机制,不共用对象,引用计数为 0,销毁 。
示例:
在这里插入图片描述

数值类型和字符串类型在 Python 中都是不可变的,这意味着你无法修改这个对 象的值,每次对变量的修改,实际上是创建一个新的对象 。

Garbage collection(GC垃圾回收)

现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但 如同一把双刃剑,为大量内存泄露,悬空指针等bug埋下隐患。 对于一个字符 串、列表、类甚至数值都是对象,且定位简单易用的语言,自然不会让用户去 处理如何分配回收内存的问题。 python里也同java一样采用了垃圾收集机制, 不过不一样的是: python采用的是引用计数机制为主标记-清除分代收集两种机制为辅的策略 。

引用计数机制
python里每一个东西都是对象,它们的核心就是一个结构体:PyObject

typedef struct_object {    
	int ob_refcnt;    
	struct_typeobject *ob_type; 
	} PyObject; 

PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对 象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的 ob_refcnt就会减少 。当引用计数为0时,该对象生命就结束了。

引用计数机制的优点:
1、简单
2、实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。 实时性还带来一个好处:处理回收内存的时间分摊到了平时。

引用计数机制的缺点:
1、维护引用计数消耗资源
2、循环引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值