背景介绍
Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然被很多编程语言使用

引用计数法是什么?
引用计数法是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术,。
当一个对象的引用被创建或者复制时,对象的引用计数加 1;当一个对象的引用被销毁时,对象的引用计数减 1;当对象的引用计数减少为 0 时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。

优点:
简单、实时性:一旦没有引用(引用计数为0),内存就直接释放了。不会像其他机制等到特定时机。
实时性还带来一个好处:处理回收内存的时间分摊到了平时。

引用计数有哪些缺点
1、引用计数机制执行效率问题:
引用计数机制所带来的维护引用计数的额外操作与 Python 运行中所进行的内存分配和释放,引用赋值的次数是成正比的。而这点相比其他主流的垃圾回收机制,比如“标记-清除”,“停止-复制”,是一个弱点,因为这些技术所带来的额外操作基本上只是与待回收的内存数量有关。

2、致命弱点:循环引用(也称交叉引用)
循环引用可以使一组对象的引用计数不为 0,然而这些对象实际上并没有被任何外部对象所引用,
它们之间只是相互引用。这意味着不会再有人使用这组对象,应该回收这组对象所占用的内存空间,然
后由于相互引用的存在,每一个对象的引用计数都不为 0,因此这些对象所占用的内存永远不会被释放。
这一点是致命的,这与手动进行内存管理所产生的内存泄露毫无区别。

怎么解决这种问题呢?
标记-清除:“标记-清除”是为了解决循环引用的问题。可以包含其他对象引用的容器对象(比如:list,set,dict,class,instance)都可能产生循环引用。原理:标记删除第一步:对执行删除(-1)后的每个引用-1,那么a的引用就是0,b的引用为1,将a放到死亡容器,将b放到存活容器。
标记删除第二步:循环存活容器,发现b引用a,复活a:将a放到存活容器内。
标记删除第三步:删除死亡容器内的所有对象。

分代回收 :“标记-清除”所带来的额外操作实际上与系统
中总的内存块的数量是相关的,内存块越多,垃圾检测操作就越多。为了提高垃圾收集的效率,采用“空间换时间的策略”。原理:将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。

解决了这么多的问题,最终目的还是为了节省内存空间,那除了回收机制,我们还能从哪些地方节省内存空间以及优化速度呢?

  1. 小整数对象池
    整数在Python中的使用广泛,为了优化速度,使用整数对象池来优化,整数对象池中的数据不会被垃圾回收。

范围 :[-5,256]

单个字母也是同样原理

  1. intern机制
    当重复创建若干变量,变量内容相同时,Python不会为相同的内容创建存储空间,
    而是使用引用计数的方式处理。

什么情况下不共用内存?
字符串数据如果存在空格则不共用数据
data = ‘love python’
data2 = ‘love python’
id(data) 不等于 id(data2)
如果是:
data0 = ‘love_python’ data1 = ‘love_python’
则:是指向同一块内存空间

不可变类型进行修改,实际是创建了新的对象,指向了另一个内存空间。

拓展浅谈其他语言的回收机制

c语言的垃圾回收是人工的,工作量大,但是可控性高。

java是自动化的,但是可控性很差,甚至有时会出现内存溢出的情况。

浅谈python的垃圾回收机制以及内存管理相关推荐

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

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

  2. JS高级-自执行函数-垃圾回收机制及内存管理

    自执行函数 函数分为两种: (1)一般函数 预解析后通过函数调用 函数名( ) 执行 (2)自执行函数 js引擎一遇到整个函数就立马执行 代码如下: js中的垃圾回收机制及内存管理 内存管理 (1)全 ...

  3. JavaScript的垃圾回收机制与内存管理

    一.垃圾回收机制-GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性 ...

  4. flash怎么强制gc_浅谈Flash的垃圾回收机制

    Flash Player的garbage collection(GC)分两种运行方式,一种是"引用计数法"(Reference Counting),一种是"标记-清除法& ...

  5. python的垃圾回收机制和析构函数__del__

    析构函数__del__定义:在类里定义,如果不定义,Python 会在后台提供默认析构函数. 析构函数__del__调用: A.使用del 显式的调用析构函数删除对象时:del对象名: class F ...

  6. a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来

    点击"开发者技术前线",选择"星标?" 13:21 在看|星标|留言,  真爱 选自<萌萌哒的柯基> 作者:heroyfhttps://www.he ...

  7. 关于python的垃圾回收机制_Python的垃圾回收机制

    知识点的铺垫 对象和引用 python作为一门动态语言,一个简单的赋值语句也是很值得研究的,重要特点就是引用对象分离. a = 1 其中整数1是一个对象,而a是一个引用.利用赋值语句,引用a指向对象1 ...

  8. python中垃圾回收机制_python 垃圾回收机制

    首先我们要说是 以引用计数为主 标记清楚和分代回收为辅 接下来分以下几个方面解释 一 引用计数 每个对象内部都维护了一个值,该值记录这此对象被引用的次数,如果次数为0,则Python垃圾回收机制会自动 ...

  9. python内存的回收机制_Python 内存管理以及垃圾回收机制

    内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...

最新文章

  1. Spring-JdbcTemplate(注入到spring容器)-01
  2. Manjaro使用笔记-使用中国源的方法
  3. react学习(26)---获取antdesign的form数据
  4. CSS选择器的权重详解
  5. 2017.9.24 虔诚的墓主人 思考记录
  6. Python+flask+flask-email发送带附件的电子邮件
  7. js 读取excel 导入mysql_可以读取EXCEL文件的js代码
  8. 干货!全网最全一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
  9. poj 3735 Training little cats (矩阵快速幂)
  10. 自然语言处理_人工智能自然语言处理技术拉动产业升级引擎
  11. 反编译工具Reflector下载(集成两个常用.net插件,FileGenerator和FileDisassembler)
  12. 集成学习01_xgboost参数讲解与实战
  13. 施耐德c语言编程软件,施耐德PLC讲座 IEC语言梯形图
  14. python下载音乐代码_基于Python实现下载网易音乐代码实例
  15. swoole:mac下的测试工具
  16. Ebay跨境智星:全自动批量注册及下单软件
  17. 船舶爬虫出现过的问题
  18. 音视频协议-RTP协议打包
  19. 仿牛客社区项目(第一章)
  20. WiFi万能钥匙首席安全官龚蔚:对公共WiFi不必谈虎色变

热门文章

  1. usb cdc 协议
  2. 二重积分转换成极坐标_二重积分转换极坐标r的范围如何确定?
  3. 使用arp欺骗进行同一局域网内的抓包
  4. web网络安全——网站入侵(三)
  5. js获取policy上传到阿里云
  6. 【渝粤题库】国家开放大学2021春2218房地产营销管理题目
  7. CnOpenData中国对联数据
  8. 如何判断是否已经安装VC++2008运行库
  9. 基于bootstrap+Java的图书管理系统
  10. MathType数学公式编辑器