再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

【Python】Python中对象管理与垃圾回收中两个很有意思的问题的更多相关文章

  1. Python 内存管理与垃圾回收

    Python 内存管理与垃圾回收 参考文献:https://pythonav.com/wiki/detail/6/88/ 引用计数器为主标记清除和分代回收为辅 + 缓存机制 1.1 大管家refcha ...

  2. 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)

    使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...

  3. javascript中的内存管理和垃圾回收

    前面的话 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存:然后,使用分配到的内存:最后,释放其内存.而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要使用垃圾回收机制.本文将 ...

  4. 流畅的python第八章对象引用,可变性和垃圾回收

    变量不是盒子 在==和is之间选择 ==比较两个对象的值,而is比较对象的标识 元组的相对不可变姓 元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用.如果引用的元素是可变的 ...

  5. Java内存管理和垃圾回收

    笔记,深入理解java虚拟机 Java运行时内存区域 程序计数器,线程独占,当前线程所执行的字节码的行号指示器,每个线程需要记录下执行到哪儿了,下次调度的时候可以继续执行,这个区是唯一不会发生oom的 ...

  6. 面试题之C# 内存管理与垃圾回收

    面试题之C# 内存管理与垃圾回收 你说说C# 的内存管理是怎么样的 这句话我记了一个多礼拜了, 自从上次东北师大面试之后, 具体请看<随便扯扯东北师大的面试>. 国庆闲着没事, 就大概了解 ...

  7. Java内存管理及垃圾回收总结

    概述 Java和C++的一个很重要的差别在于对内存的管理.Java的自己主动内存管理及垃圾回收技术使得Java程序猿不须要释放废弃对象的内存.从而简化了编程的过程.同一时候也避免了因程序猿的疏漏而导致 ...

  8. C#内存管理与垃圾回收

    垃圾回收还得从根说起,就像生儿育女一样. 根:根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null.根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为 ...

  9. JVM的生命周期、体系结构、内存管理和垃圾回收机制

    一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...

随机推荐

  1. ORA-01810:格式代码出现两次 解决方法

    在写一个sql插入数据库的时候 to_date('20140509131034','yyyyMMddHHmmss') 报ORA-01810:格式代码出现两次 原因是java中的年月日和oracle中的 ...

  2. 我的第一篇文章 —— IE6的那些css常见bug(汇总)

    我的微博终于在前几天建立了 虽说很早之前就知道博客园这个地方 但怕自己不能坚持去写一些东西一直没有建.这几天 我做了这个决定 把我的博客建起来 每周发一些看到的,听到了一些前端知识或者前沿技术. 另外 ...

  3. HDOJ 4607 - Park Visit

    用树形DP找到这颗树距离最远的两个点....对于一个询问K..若小于最远距离..显然只要走最远的这条边走K-1个边就行了.. 当K大于了最远距离..就要去走其他的点...而去其他点必须再回到这个主线. ...

  4. 依赖倒置原则DIP(面向接口编程—OOD)

    含义: 1.高层模块不应该依赖底层模块,两者都应该依赖其抽象. 2.抽象不应该依赖细节. 3.细节应该依赖抽象. 底层模块:不可分割的原子逻辑. 高层模块: 原子逻辑的再组装. 抽象:接口或者抽象类, ...

  5. html5 人物行走

    键盘方向键控制人物上下左右行走 演示地址 点击打开链接 MYCode <html> <head> <meta charset=utf-8> <title> ...

  6. CentOS 安装 Mogodb(在线 && 离线)

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html 先说推荐安装:在线安装,跟着官方走可以避免一些问题 新学Mon ...

  7. dapper 可空bool转换出错及解决方案

    最近使用entityframewok生成数据库,使用dapper来访问数据库,产生了一个意外的bug,下面是产生bug的示例以及解决方案. 由于用entityframework生成数据库,默认情况en ...

  8. PHPWAMP开启php_stomp.dll的具体方式,php5.6开启stomp的图解过程

    友情提示:其他版本,方式一样的,大家依样画葫芦即可. 首先下载PHP 扩展php_stomp.dll文件,在php官方网站搜索"Stomp",搜索后,如下图 如下图点击" ...

  9. 使用div模拟textarea,实现文本输入框高度自适应(附:js控制textarea实现文本输入框高度自适应)

    一.使用textarea标签进行多行文本的输入有很多限制,比如不能实现高度自适应,会出现难看的滚动条等问题. HTML5中添加了一个新属性contenteditable,该属性可以让input,tex ...

  10. HTML一级导航制作

    今天分享一下简单导航栏的制作方法: 第一步:引入css样式表,新建一个id为nav的层,使用<ul>.<li>.<a>标签来制作完成效果. <!DOCTYPE ...