简单介绍python的垃圾回收机制

如果不垃圾回收会发生什么问题?--内存泄漏

不再使用的内存会被一种称为垃圾回收的机制释放

python 的垃圾回收机制实际上是 一个引用计数器+一个循环垃圾收集器 来工作;

垃圾回收器是一段独立的代码,用来寻找引用计数为0 的对象;

垃圾回收器还负责检查虽然引用计数>0但也应该被销毁的对象;----循环引用

循环引用发生在有至少两个对象互相引用,垃圾回收器也会清理未引用的循环

python解释器会跟踪对象的引用技术,垃圾回收器负责释放内存

一.关于引用计数

python内部记录所有使用中的对象各有多少引用

增加引用计数:

对象被创建或者将其引用赋值,引用计数就被设置为1

1.对象被创建

2.或另外的别名被创建

3.被作为参数传递给函数

4.成为容器对象的第一个元素

import sys
print (sys.getrefcount(5001111))
a = 5001111
print (sys.getrefcount(5001111))
b = a       # 增加引用,<5001111>的计数
print (sys.getrefcount(5001111 ))
c = [b]     # 增加引用.  <5001111>的计数
print (sys.getrefcount(5001111))

def function(a):
    print ('in function, count: ', sys.getrefcount(a))
print ('pre function, count: ', sys.getrefcount(a))
function(a)
print ('end function, count: ', sys.getrefcount(a))
#一个是函数func的参数arg对obj的引用,再一个是函数栈保存了入参对arg的引用。
del a       # 减少引用<5001111>的计数
print (sys.getrefcount(5001111))
b = 100     # 减少引用<5001111>的计数
print (sys.getrefcount(5001111 ))
c[0] = -1   # 减少引用<5001111>的计数
print (sys.getrefcount(5001111))

减少引用计数

当对象的引用被销毁时,引用计数就会减少

1.本地引用离开了作用范围

2.对象的别名被显式销毁

3.对象的一个别名被赋值给其他对象

4.对象被从一个窗口对象中移除

5.窗口对象本身被销毁

二. __del__语句

析构方法,当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:
    def __del__(self):
    	print ("i will be deleted!")
f=Foo()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值