在Python中,为了解决内存泄露问题,采用了对象引用计数,并基于引用计数实现自动垃圾回

由于Python 有了自动垃圾回收功能,就造成了不少初学者误认为不必再受内存泄漏的骚扰了。但如果仔细查看一下Python文档对 __del__() 函数的描述,就知道这种好日子里也是有阴云的。下面摘抄一点文档内容如下:

Some common situations that may prevent the reference count of an object from going to zero include: circular references between objects (e.g., a doubly-linked list or a tree data structure with parent and child pointers); a reference to the object on the stack frame of a function that caught an exception (the traceback stored in sys.exc_traceback keeps the stack frame alive); or a reference to the object on the stack frame that raised an unhandled exception in interactive mode (the traceback stored in sys.last_traceback keeps the stack frame alive).

  可见, __del__() 函数的对象间的循环引用是导致内存泄漏的主凶。但没有__del__()函数的对象间的循环引用是可以被垃圾回收器回收掉的。

如何知道一个对象是否内存泄露掉了呢?

可以通过Python的扩展模块gc来查看不能回收掉的对象的详细信息。

例1:没有出现内存泄露的

import gc
import sys class CGcLeak(object):
def __init__(self):
self._text='#'*10 def __del__(self):
pass def make_circle_ref():
_gcleak=CGcLeak() print("_gcleak ref count0:{}".format(sys.getrefcount(_gcleak)))
del _gcleak try:
print("_gcleak ref count:{}".format(sys.getrefcount(_gcleak)))
except UnboundLocalError:
print("_gcleak is invalid!") def test_gcleak():
gc.enable() print("begin leak test...")
make_circle_ref() print
"\nbegin collect..."
_unreachable = gc.collect()
print("unreachable object num:{}".format(_unreachable))
print("garbage object num:{}".format(len(gc.garbage))) if __name__ == "__main__":
test_gcleak()

结果

C:\Python35\python.exe C:/wcf/django/ftest/ftest.py
begin leak test...
_gcleak ref count0:2
_gcleak is invalid!
unreachable object num:0
garbage object num:0 Process finished with exit code 0

例2:对自己的循环引用造成内存泄露

import gc
import sys class CGcLeak(object):
def __init__(self):
self._text='#'*10 def __del__(self):
pass def make_circle_ref():
_gcleak=CGcLeak()
_gcleak._self = _gcleak
print("_gcleak ref count0:{}".format(sys.getrefcount(_gcleak)))
del _gcleak try:
print("_gcleak ref count:{}".format(sys.getrefcount(_gcleak)))
except UnboundLocalError:
print("_gcleak is invalid!") def test_gcleak():
gc.enable() print("begin leak test...")
make_circle_ref() print
"\nbegin collect..."
_unreachable = gc.collect()
print("unreachable object num:{}".format(_unreachable))
print("garbage object num:{}".format(len(gc.garbage))) if __name__ == "__main__":
test_gcleak()

结果是:

C:\Python35\python.exe C:/wcf/django/ftest/ftest.py
begin leak test...
_gcleak ref count0:3
_gcleak is invalid!
unreachable object num:2
garbage object num:0 Process finished with exit code 0

例3:多个对象间的循环引用造成内存泄露 

import gc
import sys class CGcLeakA(object):
def __init__(self):
self._text='#'*10 def __del__(self):
pass class CGcLeakB(object):
def __init__(self):
self._text='$'*10 def __del__(self):
pass def make_circle_ref():
_a=CGcLeakA()
_b = CGcLeakB()
_a.s=_b
_b.s=_a print("ref count0:_a is {},_b is {}".format(sys.getrefcount(_a),sys.getrefcount(_a)))
del _a
del _b try:
print("ref count:_a is {}".format(sys.getrefcount(_a)))
except UnboundLocalError:
print("_a is invalid!") def test_gcleak():
gc.enable() print("begin leak test...")
make_circle_ref() print
"\nbegin collect..."
_unreachable = gc.collect()
print("unreachable object num:{}".format(_unreachable))
print("garbage object num:{}".format(len(gc.garbage))) if __name__ == "__main__":
test_gcleak()

运行结果:

import gc
import sys class CGcLeakA(object):
def __init__(self):
self._text='#'*10 def __del__(self):
pass class CGcLeakB(object):
def __init__(self):
self._text='$'*10 def __del__(self):
pass def make_circle_ref():
_a=CGcLeakA()
_b = CGcLeakB()
_a.s=_b
_b.s=_a print("ref count0:_a is {},_b is {}".format(sys.getrefcount(_a),sys.getrefcount(_a)))
del _a
del _b try:
print("ref count:_a is {}".format(sys.getrefcount(_a)))
except UnboundLocalError:
print("_a is invalid!") def test_gcleak():
gc.enable() print("begin leak test...")
make_circle_ref() print
"\nbegin collect..."
_unreachable = gc.collect()
print("unreachable object num:{}".format(_unreachable))
print("garbage object num:{}".format(len(gc.garbage))) if __name__ == "__main__":
test_gcleak()

转自:

http://www.cnblogs.com/kaituorensheng/p/4449457.html

Python垃圾回收机制:gc模块(zz)的更多相关文章

  1. Python垃圾回收机制:gc模块

    在Python中,为了解决内存泄露问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收. 由于Python 有了自动垃圾回收功能,就造成了不少初学者误认为不必再受内存泄漏的骚扰了.但如果仔细查看一 ...

  2. 浅析Python垃圾回收机制!

    Python垃圾回收机制 目录 Python垃圾回收机制 1. 内存泄露 2. Python什么时候启动垃圾回收机制? 2.1 计数引用 2.2 循环引用 问题:引用计数是0是启动垃圾回收的充要条件吗 ...

  3. 简述Python垃圾回收机制和常量池的验证

    目录 通过代码验证python解释器内部使用了常量池 Python的引入 变量的引入 为什么要有变量 定义变量 常量引入 常量池引入 Python解释器 Python变量存储机制 Python垃圾回收 ...

  4. 垃圾回收机制GC

    垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...

  5. 垃圾回收机制GC知识再总结兼谈如何用好GC

    一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...

  6. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...

  7. python垃圾回收机制与小整数池

    python垃圾回收机制 当引用计数为0时,python会删除这个值. 引用计数 x = 10 y = x del x print(y) 10 引用计数+1,引用计数+1,引用计数-1,此时引用计数为 ...

  8. python垃圾回收机制:引用计数 VS js垃圾回收机制:标记清除

    js垃圾回收机制:标记清除 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理 当变量进入环境时,将这个变量标记为"进入 ...

  9. 垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)

    来源 图像操作,易内存泄露,边界像素 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对 ...

随机推荐

  1. [Mac]Mac OS X中WireShark的使用,及找不到网卡问题的解决方法

    1.WireShark依赖X11: 2.默认情况下Mac OS X是不安装X11的: 因此,在Mac上安装WireShark,首先找出Mac OS 安装DVD安装X11. 安装完以后 echo $DI ...

  2. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  3. 软工实践Beta冲刺(1/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  4. css实现div一直旋转

    看到音乐播放器播放界面的唱片一直旋转,突然想到在网页中的一直旋转效果,所有特地查了一下分享出来 这是一个静态的div,然后把它旋转动起来.效果请看右上角的音乐播放按键一样. 代码如下: <htm ...

  5. exit和die的区别

    网上搜索die与exit两个函数的区别,大部分的"标准答案"都是说die是退出并释放内存,exit是退出但不释放内存. 这个解释显然是错的,PHP手册中已经说过"die ...

  6. P1559 运动员最佳匹配问题

    题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势 ...

  7. 第一个贴上XMT标签的Hadoop程序

    距离老板留给我并行化做属性约简的任务开始到今天,已是一周有余,期间经历过各种呕心沥血,通宵达旦,终于运行出了一个结果.其中在配置过程中,浪费了爷大量的时间,有时回想自己上个周干的事情,会觉得分明的本末 ...

  8. 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案

    转自:http://www.2cto.com/database/201503/386267.html 中文显示问号 转自:http://zhidao.baidu.com/link?url=qJDmsa ...

  9. IE提示是否只查看安全传送的网页内容

    IE选项-->安全-->点上面那个地球internet-->点下面那个 自定义级别-->找到“其他”-->显示混合内容,改为启用,重启打开下IE,就可以了

  10. [Leetcode] Reverse linked list ii 反转链表

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given1->2 ...