再Python中是利用引用计数来实现对象管理和垃圾回收的,即其他对象引用该对象时候,其引用计数加1,反之减1,当引用计数为0时候,被垃圾收集器回收。

  Python解释器对对象以及计数器的管理分为以下两步:

  1)其引用计数减1

  2)判断引用计数是否为0,为0的话,销毁对象

  因为使用引用计数,造成两个问题,GIL和循环引用

一.GIL(Global Interpreter Lock)全局解释器锁

  试想一下在多线程中使用引用计数,比如线程a,b同时引用obj,那么obj的引用计数为2。

  1)当a撤销对obj的引用时候,刚做完第一步,发生线程切换,进入线程b

  2)正好b也撤销对obj的引用,obj的引用计数变为0,销毁对象,释放内存

  3)切换回线程a,a继续第二步,销毁对象。。。。结果未知

为了解决这个问题,就引入了GIL,保证对虚拟机内部共享资源的互斥性(mutex),每一时刻只有一个线程工作。如果想使用多线程的话,只有绕过GIL。。。

二.循环引用

  先看一个例子:

 class leak(object):
def __init__(self):
print("object with {0} was born".format(id(self))) while(True):
A = leak()
B = leak()
A.b = B
B.a = A
A = None
B = None

当创建的两个对象相互引用时候,即使最后把对象的两个变量指向别处,已经创建的对象的引用计数不会为0,也就不会被销毁,造成内存泄漏。。。

(我电脑跑了半天也没内存耗光。。。悲剧)

这种情况可以通过显示的调用gc.collect()进行垃圾回收

参考资料:《改善Python程序的91个建议》68、69

最新文章

  1. Autofac - 生命周期
  2. Java重点之小白解析--浅谈HashMap与HashTable
  3. unity3d 镜头随鼠标移动
  4. EXCEL某列长度超过255个字符导入SQL SERVER的处理方法
  5. mysql事件
  6. poj 3279 Fliptile
  7. Requirements
  8. 在ubuntu中获得root权限
  9. python命令行解析工具argparse模块【3】
  10. RecyclerView.ItemDecoration
  11. 小实例---关于input宽度自适应以及多个input框合并拆分
  12. 译-what is cmdlet
  13. 20162330 实验二 《Java面向对象程序设计》 实验报告
  14. angualar2——八大组成
  15. SpringBoot系列十:SpringBoot整合Redis
  16. Day3 Python基础之while、for循环(二)
  17. python基础知识点四
  18. P2765 魔术球问题
  19. 大数据入门第二十二天——spark(二)RDD算子(2)与spark其它特性
  20. 2 引入jquery和boot

热门文章

  1. [转]unload dynamic library needs two dlclose() calls?
  2. [转]Whirlwind Tour of ARM Assembly
  3. 字符串拼接 strcat ;数组和指针的区别
  4. jquery验证表单中的单选与多选
  5. D3DXCreateTextureFromFileInMemoryEx函数
  6. .net下灰度模式图像
  7. 昨天CSAPP上的疑问的解答
  8. AngularJS 跨站请求- jsonp请求
  9. eclipse 中导入 maven项目 启动报错
  10. js处理层级数据结构的一些总结