python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。

总结一下对象会在一下情况下引用计数加1:

1.对象被创建:x=4

2.另外的别人被创建:y=x

3.被作为参数传递给函数:foo(x)

4.作为容器对象的一个元素:a=[1,x,'33']

引用计数减少情况

1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。

2.对象的别名被显式的销毁:del x ;或者del y

3.对象的一个别名被赋值给其他对象:x=789

4.对象从一个窗口对象中移除:myList.remove(x)

5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

垃圾回收

1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。

2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。

在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

本文转载自:python黑洞网   原文链接:http://www.pythonheidong.com/blog/article/7/

最新文章

  1. JQuery mobile中按钮自定义属性的改变
  2. shell中对字符串的处理
  3. mysql——第一次学习记的笔记
  4. vi, vim 基本使用(1)
  5. iOS完美的网络状态判断工具
  6. hibernate配置文件详细解释
  7. 合(析)取范式转主合(析)取范式--》Java实现
  8. Visual Studio 2015 开发MVC4出现错误
  9. JAVA GC之标记 第五节
  10. 关于并行计算的Scan操作
  11. CSS清除浮动各种方法
  12. python学习好文
  13. Javascript sort方法
  14. 关于Hbuild引用mui常用代码块以及部分控件.
  15. PHP实用代码片段(三)
  16. gz文件最后四位检测
  17. 【重要】新浪微博api研究
  18. CF1139D Steps to One 题解【莫比乌斯反演】【枚举】【DP】
  19. linux下启动和终止JAVA程序shell脚本
  20. 如何用纯 CSS 创作一个摇摇晃晃的 loader

热门文章

  1. Git操作----删除untracked files
  2. python-进程之间通信、多线程介绍
  3. swift 学习- 15 -- 构造过程 01
  4. Confluence 6 针对站点维护使用只读模式
  5. android studio 包名冲突解决
  6. 《剑指offer》替换空格
  7. Java 把一个文本文档的内容复制到另一个文本文档
  8. jenkins自动构建版本
  9. java反射机制实例
  10. 五.hadoop 从mysql中读取数据写到hdfs