【Python】Python中对象管理与垃圾回收中两个很有意思的问题
2024-08-27 04:46:47
再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
最新文章
- Autofac - 生命周期
- Java重点之小白解析--浅谈HashMap与HashTable
- unity3d 镜头随鼠标移动
- EXCEL某列长度超过255个字符导入SQL SERVER的处理方法
- mysql事件
- poj 3279 Fliptile
- Requirements
- 在ubuntu中获得root权限
- python命令行解析工具argparse模块【3】
- RecyclerView.ItemDecoration
- 小实例---关于input宽度自适应以及多个input框合并拆分
- 译-what is cmdlet
- 20162330 实验二 《Java面向对象程序设计》 实验报告
- angualar2——八大组成
- SpringBoot系列十:SpringBoot整合Redis
- Day3 Python基础之while、for循环(二)
- python基础知识点四
- P2765 魔术球问题
- 大数据入门第二十二天——spark(二)RDD算子(2)与spark其它特性
- 2 引入jquery和boot
热门文章
- [转]unload dynamic library needs two dlclose() calls?
- [转]Whirlwind Tour of ARM Assembly
- 字符串拼接 strcat ;数组和指针的区别
- jquery验证表单中的单选与多选
- D3DXCreateTextureFromFileInMemoryEx函数
- .net下灰度模式图像
- 昨天CSAPP上的疑问的解答
- AngularJS 跨站请求- jsonp请求
- eclipse 中导入 maven项目 启动报错
- js处理层级数据结构的一些总结