python类中显示重写__del__方法,引起循环引用的对象无法释放,造成垃圾泄露问题

摘要:
通常,Python的gc垃圾收集机制有一组算法,可用于循环引用对象以避免内存泄漏。但是,有一个例外:显示覆盖__del__方法输出结果:存在循环引用。引入MethodTest方法后,无法回收这两个对象,从而导致内存泄漏。因此,建议不要重写__del__。否则,您需要手动释放具有循环引用的资源。

通常情况下,python的gc 垃圾回收机制,有一套算法,可以用来回收循环引用的对象,避免内存泄露。

不过,有个例外的情况:显示重写了__del__方法。

例子:

#-*- coding: UTF-8 -*-#-------------------------------------------------------------------------------#Name:        #Purpose:     #
#Author:      ankier#
#Created:     28-03-2013#Copyright:   (c) ankier 2013#Licence:     <your licence>#-------------------------------------------------------------------------------
importgc
importtime

classTeacher:
    def __init__(self):
        self.Stu =None
        
    def __del__(self):
        print '释放 Teacher实例'
        
classStudent:
    def __init__(self):
        self.Tea =None
    
    def __del__(self):
        print '释放 Student实例'
    
defMethoTest():
    tea =Teacher()
    stu =Student()
    
    #设置循环引用
    tea.Stu =stu
    stu.Tea =tea  
    deltea
    delstu
        
if __name__ == '__main__':  
    gc.enable()
    gc.set_debug(gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE |\
        gc.DEBUG_INSTANCES |gc.DEBUG_OBJECTS)
    
    MethoTest()
    
    print '开始内存回收...'_unreachable =gc.collect()
    print '无法到达的对象个数: %d' %_unreachable
    print '内存泄露的对象个数:%d' %len(gc.garbage)
    
    time.sleep(3)
    print '程序退出!'
    

输出结果:存在循环引用,所在再推出方法MethodTest 后,已经无法回收改2个对象,导致了内存泄露。

python类中显示重写__del__方法,引起循环引用的对象无法释放,造成垃圾泄露问题第1张

如果把重写__del__方法给注释掉,不主动重写,则即使存在循环引用,python gc 机制 也能很好的释放资源。

如下图结果,所有的资源已经释放掉了。因此,再python 代码编写过程中,建议不要重写__del__方法,否则,就需要自己去手动释放带有循环引用的资源。前者更好的选择。

python类中显示重写__del__方法,引起循环引用的对象无法释放,造成垃圾泄露问题第2张

免责声明:文章转载自《python类中显示重写__del__方法,引起循环引用的对象无法释放,造成垃圾泄露问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JMeter 文件上传下载跨越交换机的TPLink交换机配置VLAN部分图解(四)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

指令脚本redis线上环境监控脚本(python脚本)

在改章节中,我们要主介绍指令脚本的内容,自我觉感有个不错的议建和大家分享下 近来一个月没啥新更,边身生发太多事,结业几年来霉运太多,虽然不信命,但我信有些性命的确好,有些性命的确差,其它不说也罢。(大家定一要意注身材啊,康健比任何西东都主要) 本文要监控的这个脚本,是在一个月前阁下,对于线上redis中项指令操纵须要行进统计析分时写的一个工具: 一.需求...

[ Python入门教程 ] Python中日期时间datetime模块使用实例

Python中datetime模块提供强大易用的日期处理功能,用于记录程序操作或修改时间、时间计算、日志时间显示等功能。datatime模块重新封装了time模块,提供的类包括date、time、datetime、timedelta、tzinfo。本文提供datetime模块最常用的使用实例,解决编码中使用datetime模块的大部分需求。datetime...

Python脚本与Metasploit交互攻击

Metasploit是一款强大的漏洞扫描和利用工具,编写Python脚本与Metasploit进行交互,可以自动化的扫描和利用漏洞。 相关文章:Metasploit框架的使用 在脚本中,我们首选需要利用 nmap 模块扫描目标主机是否开放了445端口,我们写了一个 findTarget()函数,来扫描给定ip或者给定网段中开放了目标端口的主机,返回开放了4...

pip离线安装Bottleneck报Error解决

1. 前言 操作系统:centos7.2 python版本:3.7 pip版本:20.2.4 公司一个AI项目需要部署,但是客户的服务器环境是在内网,无法联网更新,于是在公司开发服创建了一个同样的环境,离线下载安装包后再进行安装,关于离线安装可以参考:python使用pip离线安装库 因为使用了一个叫fastai的库,需要依赖Bottleneck,然后这个...

python 绘图---2D、3D散点图、折线图、曲面图

python中绘制2D曲线图需要使用到Matplotlib,Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。 1. 绘制折线图 plt.plot() 可以用于绘制折线图。...

【转】Python 数据库连接池

    python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用。 python的数据库连接池包:DBUtils DBUtils提供两种外部接...