文章目录
一、生命周期:
1、概念:一个对象从创建到消亡的过程
当一个对象呗创建是,会在内存中分配响应的内存空间进行存储
当这个对象不再使用,为了节约内存,会把这个对象释放
2、如何监听生命周期:
1、(__new__):当我们创建一个对象时,用于给这个对象分配内存,通过拦截这个方法,可以修改创建对象的过程:例如单例模式
使用使用装饰器(使用了装饰器的类会变成单例类)
def single_class(cls):
instance = {}
def single(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
else:
return instance[cls]
return single
@single_class
class Man(object):
pass
man1 = Man()
man2= Man()
print(man1)
print(man2)
2、(__init__):实例化对象的时候执行此方法
3、(__del__):进程结束的时候执行
二、内存管理机制
1.存储方面
1、万物皆对象
2、所有对象都会开辟内存存储
3、整形及短小字符Python会缓存,不会创建多个相同对象
4、容器对象,仅仅是其他对象的引用,不是对象本身
2、垃圾回收
1、引用计数
1、概念:一个对象记录着本身被引用的次数
2、描述:当增加一个引用,计数+1;当减少一个引用,计数-1;引用=0时释放内存
3、计数+1场景:对象创建;对象被引用;对应被当做参数传入函数;对象被当做元素放在容器中
4、计数-1场景:被显试销毁;引用别名被赋值(覆盖);离开作用域(函数执行结束);容器销毁
查看计数:sys模块
2、垃圾回收
1、作用:解决引用计数未释放的对象(容器对象)
2、底层机制:
1、收集容器对象 通过双向连表引用
2、对每个容器,通过变量gc_refs记录引用计数
3、找到引用他的容器,然后计数-1
4、经过三个步骤,如果计数为0,就可以释放了
3、分代回收(减少垃圾检测的频率)(新增对象达到一定数量才会触发)
1、默认刚创建的对象属于0代
2、如果经历一代回收,依然存活,就划分下一代
3、回收周期顺序:0代回收一定次数(可自定义),触发0代和1代回收;1代回收一定次数,触发0代,1代,2代回收
4、查看默认参数及自定义参数 gc gc.get_threshold() gc.set_threshold(700, 10, 5)
4、补充:自定义参数设置
自定义设置
import gc
gc.disable()
print("gc.disable 开启状态", gc.isenabled())
gc.enable()
print("gc.enable 开启状态", gc.isenabled())
print("gc获取默认参数:", gc.get_threshold())
gc.set_threshold(1000, 20, 10)
print("gc获取自定义参数:", gc.get_threshold())
输出结果
gc.disable 开启状态 False
gc.enable 开启状态 True
gc获取默认参数: (700, 10, 10)
gc获取自定义参数: (1000, 20, 10)