常见的GC算法

引用计数

为每个内存对象维护一个引用计数。

当有新的引用指向某对象时就将该对象的引用计数加一,当指向该对象的引用被销毁时将该计数减一,当计数归零时,就回收该对象所占用的内存资源。

标记-清除

分两个步骤,一是标记,即从众多的内存对象中区分出不会再被使用的垃圾对象;

二是清除,即把标记的垃圾对象清除掉。标记的时候需要确定内存对象的集合Root set,集合里的对象都是可以访问的。如果Root set中的对象引用了其他的对象,那么被引用的对象也不能被标记为垃圾对象。然后从Root set出发,递归遍历Root set能访问到的所有对象,进行标记为不是垃圾对象。遍历结束后,没有被标记的就是垃圾对象。

分代收集

根据一个统计学上的结论,如果一个内存对象在某次Mark过程中发现不是垃圾,那么它短期内成为垃圾的可能性就很小。分代收集将那些在多次垃圾收集过程中都没有被标记为垃圾对象的内存对象集中到另外一个区域——年老的区域,即这个区域中的内存对象年龄比较大。因为年老区域内内存对象短期内变成垃圾的概率很低,所以这些区域的垃圾收集频率可以降低,相对的,对年轻区域内的对象进行高频率的垃圾收集。这样可以提高垃圾收集的整体性能。

Python中的内存管理

在CPython中,大多数对象的生命周期都是通过对象的引用计数来管理的。引用计数是一种最直观、最简单的垃圾收集计数,与其他主流GC算法比较,它的最大优点是实时性,即任何内存,一旦没有指向它的引用,就会立即被回收。

然而引用计数存在两个比较麻烦的缺陷:

当程序中出现循环引用时,引用计数无法检测出来,被循环引用的内存对象就成了无法回收的内存,引起内存泄露。比如:

list1 = []

list1.append(list1)

del list1

list1循环引用了自身,第二行执行完后,list1的GC变成了2,执行完del操作后,list1的引用计数变为1,并没有归零,list1的内存空间并没有被释放,造成内存泄露。

维护引用计数需要额外的操作。

在每次内存对象呗引用或者引用被销毁时都需要修改引用计数,这类操作被称为footprint。引用计数的footprint是很高的,使得程序的整体性能受到很大的影响。

为了解决循环引用的问题,CPython特别设计了一个模块——GC module,其主要作用就是检查出循环引用的垃圾对象,并清除他们。该模块的实现,实际上也是引入了前面提到的两种主流的垃圾收集技术——标记清除和分代收集。

为了解决引用计数的性能问题,尽量再内存的分配和释放上获得最高的效率,Python因此还设计了大量的内存池机制。

python是不是特别垃圾-Python里的垃圾回收机制是什么意思,搞不懂?相关推荐

  1. Java 技术之垃圾回收机制

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 垃圾回收机制是 Java 非常重要的特性之一,也是面试题的常客.它让开发者无需关注空间的创建和 ...

  2. Java 垃圾回收机制

    垃圾回收机制是 Java 非常重要的特性之一,也是面试题的常客.它让开发者无需关注空间的创建和释放,而是以守护进程的形式在后台自动回收垃圾.这样做不仅提高了开发效率,更改善了内存的使用状况. 今天本文 ...

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

    python中有自动内存回收机制,一般情况不需要程序员来处理,面试时被大佬问到了,记录一下.没有画图,推荐读参考的第一篇博文 gc方式1:引用计数 若此对象无其他对象引用,则立马回收掉 优点:简单.实 ...

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

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

  5. Python内存管理以及垃圾回收机制

    垃圾回收:用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表,这个链表就比较厉害了,因为Python程序中一旦创 ...

  6. Python高级编程——13.垃圾回收机制

    垃圾回收(了解) 1.1 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257 ...

  7. python和ruby的垃圾回收机制

    很高兴能够看到这样详细生动的文章,特来分享给大家.为了表示对原文的尊重,本文修改了个别书写和表述错误. 画说 Ruby 与 Python 垃圾回收 英文原文: visualizing garbage ...

  8. [转载]Python垃圾回收机制--完美讲解!

    虽然是自己转载的但是是真的好的一篇图文并茂的对垃圾回收机制的讲解!!! 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c#等,都采用了 ...

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

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

最新文章

  1. 以太坊智能合约函数参数ABI编码,动态类型string编码,函数参数的ABI编码, 含c++代码
  2. 经济和信息化谋定研究-左晓栋:国家网络安全事件应急预案
  3. Android面试题详细整理系列(三)
  4. asp:HyperLink中 Eval要用string.Format绑定
  5. 随行笔记小程序个人信息页源码
  6. WORD如何对标题批量地应用样式?
  7. 我们无法更新系统保留的分区_系统更新是我们手机的基本功能之一 安卓智能更新有哪些用途...
  8. mysql myisam key_buffer_size_MyISAM中key_buffer_size的设置_MySQL
  9. 安卓适配器类中怎么调用intent_设计模式:代理模式/中介者模式 / 桥接模式/适配器 - 七星望...
  10. STM32+AD7124+热电偶方案+Pt100冷端补偿解析工程源码,源码包含Pt100、NTC热敏、热电偶处理驱动源码
  11. MSDP协议报文类型
  12. 关于个人求职简历的一些见解
  13. html 鼠标划过 ie导致白屏,win7系统IE浏览器网页出现白屏的解决方法
  14. 注销公司是否需要办理注销呼叫中心许可证?
  15. Python绘制对多角星
  16. MATLAB 多元线性回归(regress)
  17. 如何在局域网下建立共享文件夹?
  18. linux下文件怎么改名字,Linux文件名字批量修改步骤 Linux修改文件名的方法
  19. 无聊的程序员教你如何使用十几行代码练就单身20年的手速(文末彩蛋)
  20. Python运维开发(CMDB资产管理系统)--环境部署(上)

热门文章

  1. 红绿灯问题(位运算)
  2. EXCEL-常用函数总结
  3. Pycharm常用的使用方法
  4. Linux基础-兄弟连Linux
  5. PokeCats开发者日志(一)
  6. freemarker了解
  7. css selector list
  8. [Windows]Windows路径探究
  9. 数控技能大赛计算机程序设计员,2018全国技能大赛–第八届全国数控技能大赛通知...
  10. python程序设计语言是什么类型的语言-Python 是弱类型的语言 强类型和弱类型的语言区别...