Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。

在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。

1 引用计数

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

优点:

  1. 简单
  2. 实时性

缺点:

  1. 维护引用计数消耗资源
  2. 循环引用(reference cycle)。举个例子,假设有两个对象o1o2,而且符合o1.x == o2o2.x == o1这两个条件。如果o1o2没有其他代码引用,那么它们就不应该继续存在。但它们的引用计数都是1。垃圾回收器会定时寻找这个循环,并将其回收。

2 标记-清除机制

基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。

3 分代技术

分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。

Python默认定义了三代对象集合,索引数越大,对象存活时间越长。

举例: 当某些内存块M经过了3次垃圾收集的清洗之后还存活时,我们就将内存块M划到一个集合A中去,而新分配的内存都划分到集合B中去。当垃圾收集开始工作时,大多数情况都只对集合B进行垃圾回收,而对集合A进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。在这个过程中,集合B中的某些内存块由于存活时间长而会被转移到集合A中,当然,集合A中实际上也存在一些垃圾,这些垃圾的回收会因为这种分代的机制而被延迟。

转载于:https://www.cnblogs.com/wumingxiaoyao/p/7027071.html

**Python垃圾回收机制相关推荐

  1. python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理

    Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...

  2. python是不是特别垃圾-谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...

  3. python垃圾回收离职_谈谈python垃圾回收机制

    什么是垃圾回收机制? 首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来. 在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾. ...

  4. python垃圾回收机制原理_如何理解和掌握Python垃圾回收机制?

    在编程世界里,当一个对象失去引用或者离开作用域后,它就会被当做垃圾而被自动清除,这就是垃圾回收机制.在现在的高级语言如Python.Java都使用了垃圾回收机制,不过与Java采用的垃圾收集机制不同, ...

  5. python 垃圾回收机制

    DAY 18. python垃圾回收机制 python GC主要有三种方式 引用计数 标记清除 分代回收 其中,以引用计数为主. 18.1 引用计数(Reference Counting) <寻 ...

  6. python多线程详解 Python 垃圾回收机制

    文章目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 总结起来,使用多线程编程具有如下几个优点: 二.线程实现 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 ...

  7. python垃圾回收机制

    python垃圾回收机制 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄 ...

  8. 趣谈Python垃圾回收机制

    今天唠点啥 上次发文看到有位朋友评论"来了,来了,他来了",哈哈哈哈觉得挺逗.确实,老Amy今天又来啦[此处应该有掌声]~ 我就寻思着,上篇文章车都开稳了,今天要怎么假装" ...

  9. Python垃圾回收机制详解

    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...

  10. python垃圾回收机制(GC)相关问题

    在使用python中很少遇到内存溢出的问题,也不关心内存的管理问题,这是高级语言自带的处理机制,将内部的垃圾空间清除. 要清楚是怎么回收垃圾的,那我们应该先明白什么情况下产生垃圾,就涉及到python ...

最新文章

  1. Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题
  2. 笔记-项目质量管理-编制质量管理计划的工具与技术
  3. Qt Creator桌面平台
  4. 为什么老师批改完试卷,分数下要画两条横线?今天终于知道了!
  5. Spark 机器学习中的线性代数库
  6. 信息学奥赛一本通 1105:数组逆序重存放 | OpenJudge NOI 1.6 04
  7. C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法
  8. html算命源码,index.html
  9. java进程宕机生产core_Java应用/JVM宕机排查步骤操作
  10. 结构化分析和面向对象分析的区别 例子_淘宝客佣金是什么意思?跟淘宝客服务费有什么区别?-【邯郸seo】...
  11. uvaoj 10066 - The Twin Towers 最长公共子序列(LCS)
  12. 网易Python爬虫:爬取网易科技频道文章存入MySQL数据库
  13. 搜索Instagram用户名API
  14. 助你上手Vue3全家桶之Vue3教程
  15. OpenWrt——进行PPPoE拨号时透过路由器访问光猫的方法
  16. OAuth2的运行机制(GitHub单点登录)
  17. 梦想照进现实的百度Apollo,越来越近的无人驾驶时代
  18. 青少年CTF--misc部分题解
  19. tcp 如何维护长连接
  20. dvwa之 file upload (low)一句话木马和中国菜刀

热门文章

  1. b站前端大佬_最强UP主:罗翔老师,你凭什么打败B站千万粉大佬老番茄?
  2. UITableView 调整 Header 层级关系
  3. (iOS-框架封装)AFN3.x 网络请求封装
  4. JavaScript基础,Cookies,Sessions
  5. 借条的注意事项,上面不能有这3个字
  6. 展开被 SpringBoot 玩的日子 《 二 》 WEB 开发
  7. 自定义checkbox,redio等
  8. iOS开篇——UI之UIStepper (计步器)
  9. AndroidStudio(1 下载安装,环境搭建,使用设置)
  10. linux 知识汇总