• python学习03垃圾回收机制


    ‘’’
    1、引用计数
    2、标记-清除
    3、分代回收

    python中垃圾回收机制GC主要使用引用计数进行垃圾回收,通过标记-清除解决容器对象产生循环引用的问题,通过
    分代回收以空间换时间的方式提高垃圾回收的效率

    python对象的核心是Pyobject结构体,该结构体通过ob_refcnt实现变量的引用计数
    结构体如下:
    typedef struct_object{
    int ob_refcnt
    struct_typeobject *ob_type;
    }
    程序在运行过程中会实时的更新ob_refcnt的值,来反应引用当前对象的名称和数量
    当对象的引用计数值为0,那么它的内存就会被立即释放掉,即被垃圾回收

    以下情况是导致引用计数加1的情况:
    1、对象被创建,如a = 2333
    2、对象被引用,如b = a
    3、对象作为参数,传入到一个函数中
    4、对象作为元素,存储在容器中

    以下情况会导致引用计数减1:
    1、对象别名被显示销毁del
    2、对象别名被赋予新的对象
    3、一个对象离开它的作用域
    4、对象所在的容器被销毁或者是从容器中删除对象
    可以通过sys包中的1getrefcount()来获取一个名称所引用的对象当前的引用计数
    getrefcount()本身会使得引用计数加1
    ‘’’
    #引用计数无法解决容器对象循环引用的问题

    a = [1,2]
    b = [2,3]
    a.append(b)
    b.append(a)
    del a
    del b```
    
    #循环使用导致计数永不为0
    
    #标记清除是一种优化策略,分为标记和清除两个阶段
    #标记阶段,遍历所有对象,如果对象是可达的,还有对象引用它,标记该对象为可达
    #清除阶段,再次遍历对象,如果发现某个对象没有标记为可达,否则就将其回收
    #标记-清除垃圾回收的阶段,会暂停整个应用程序,等待标记清除结束后才会恢复应用程序的运行
    '''
    分代回收,以空间换时间的方式提高垃圾回收的效率
    对于程序,存在一定比例的内存块生命周期比较短,而剩下的内存块,生命周期比较长。对象存在时间越长,越
    不可能是垃圾,应该减少回收。
    python有三种世代(0,1,2),某个变量在第0代扫描中存在,将被移至一代,被扫描的次数将会减少,如果又
    活过了一代gc,将被移动至2代,在2代中被扫描的次数将会更少。
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    字体族与图标字体
    C语言-结构体(7)
    Docker——Windows版本Docker安装
    屏幕状态自动检测+鼠标自动操作
    C++ template class
    我的NVIDIA开发者之旅——优化显卡性能
    2.6python 函数_python量化实用版教程(初级)
    Kotlin 中如何使用 Fuel 库进行代理切换?
    如何搭建数据驱动自动化测试框架?
    生成树协议:监控 STP 端口和交换机
  • 原文地址:https://blog.csdn.net/mitudeniu/article/details/126474384