郑文峰的博客 郑文峰的博客
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

zhengwenfeng

穷则变,变则通,通则久
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • python

    • 基础

      • python迭代器与生成器
      • python元编程
      • python垃圾回收机制
        • 引用计数
        • 标记-清除
        • 分代回收
        • 垃圾回收触发情况
      • python上下文管理器
      • python装饰器的使用方法
      • 使用python实现单例模式的三种方式
      • python中import原理
    • 第三方库

    • django

    • flask

    • tornado

    • 其他

  • go

  • 其他

  • 编程
  • python
  • 基础
zhengwenfeng
2022-08-10
目录

python垃圾回收机制

# 引用计数

每次对象被引用时,会被计数加1,当计数为0时,则回收该对象。

注意: 循环引用的情况,引用计数不能解决.

# 标记-清除

对所有活跃的对象进行标记,对非活跃对象进行回收。可以有效的解决循环引用的问题

原理 对象之间通过引用构建有向图,从root object(全局变量,寄存器等不可删除的对象)出发,沿着有向边遍历对象,可达的对象标记为活跃对象,不可达的对象就是要被清除的非活动对象。

在下图中,从黑点开始出发,1对象可达,2、3间接可达,1、2、3是活跃对象,4,5不可达,所以是非活跃对象,进行回收。 在这里插入图片描述

过程 找到root object集合, 在内存建立两条连表,一条链表维护root object集合,另一条链表哦维护剩下的对象,在标记的过程中,如果在不可达链表中存在被root链表中的独享,直接或间接引用独享,就将其从不可达链表移到root链表中。当完成标记后,不可达链表剩下的对象都是垃圾对象,进行回收。

# 分代回收

对象分在不同集合中,每个集合称为一个代, Python中分为3代,年轻代(第0代)、中年代(第1代)、老年代(第二代),对应3各链表,每一代GC频率不同,第0代最高,第1代次之,第二代最低(越年轻的对象越容易死掉,而老的对象通常会存错更久),新生的对象放入第0代,如果该对象在第0代的一次GC中存活,则移动到第1代,如果第一代对象在第1代GC中存错,则移动到第2代。

什么情况触发GC, 可以设置阈值,也可以手动调用gc.collect()

每次扫描全部对象,费时费力,提高GC的效率。

# 垃圾回收触发情况

调用gc.collect(),需要先导入gc模块。

当gc模块的计数器达到阈值的时候。阈值可以设置

#python
上次更新: 2023/01/15, 15:47:48
python元编程
python上下文管理器

← python元编程 python上下文管理器→

最近更新
01
django rest_framework 分页
03-20
02
学习周刊-第03期-第09周
03-03
03
学习周刊-第02期-第08周
02-24
更多文章>
Theme by Vdoing | Copyright © 2022-2023 zhengwenfeng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式