资源描述:
《分析python中的内存泄漏》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、我真正系统地接触和学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解分析Python中的内存泄漏 分析Python中的内存泄漏 引子 之前一直盲目的认为Python不会存在内存泄露,但是眼看着上线的项目随着运行时间的增长而越来越大的内存占用,我意识到我写的程序在发生内存泄露,之前debug过logging模块导致的内存泄露. 目前看来,还有别的地方引起的内存泄露.经过一天的奋战,终于找到了内存泄露的地方,目前项目跑了很长时间,在业务量较小的时候内存还是能回到刚启动的时候的内存占用. 什么情况下不用这么
2、麻烦 如果你的程序只是跑一下就退出大可不必大费周章的去查找是否有内存泄露,因为Python在退出时会释放它所分配的所有内存,如果你的程序需要连续跑很长时间那么就要仔细的查找是否产生了内存泄露. 场景 如何产生的内存泄露呢,项目是一个TCPserver,每当有连接过来时都会创建一个连接实例来进行管理,每次断开时连接实例还被占用并没有释放.没有被释放的原因肯定是因为有某个地方对连接实例的引用没有释放,所以随着时间的推移,连接创建分配内存,对党的认识也有了进一步的提高。才真正体会到了中国共产党的伟大、光荣和正确,更感到只有中国共产党是全中国最广大人民利益的忠实代表我真正系统地接触和
3、学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解连接断开并没有释放掉内存,所以就会产生内存泄露. 调试方法 由于不知道具体是哪里引起的内存泄露,所以要耐心的一点点调试. 由于知道了断开连接时没有释放,所以我就不停的模拟创建连接然后发送一些包后断开连接,然后通过下面一行shell来观察内存占用情况: PID=50662;whiletrue;do;psaux
4、grep$PID
5、grep-vgrep
6、awk'{print$5""$6}'>>t;sleep1;done 如果在增长了一定的量后保持住就说明已经
7、没有产生泄露. 同时可以在对象该释放的时候查看对象的引用计数,通过sys.getrefcount(obj).如果引用计数变为了2则说明该对象在跳出命名空间后就会被正确回收. 产生原因 项目中两种情况导致对象没有被正确回收: 被退出才回收的对象引用 交叉引用 被退出才回收的对象引用 为了追踪连接所以把连接对象同时放在一个列表里,而这个列表只有在程序退出时才会被回收,如果不正确处理,那么分配的对象将也会只在程序退出时才会被回收.对党的认识也有了进一步的提高。才真正体会到了中国共产党的伟大、光荣和正确,更感到只有中国共产党是全中国最广大人民利益的忠实代表我真正系统地接触和学
8、习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解 全局变量和类变量都只会在程序退出的时候才会被回收: _CONNECTIONS=[] #... classConnection(object): def__init__(self,sock,address) pass defserver_loop(): #... sock,address=server_sock.accept() connection=Connection(sock,address) _CONNECTIONS.append(c
9、onnection) #... sock.close() 上面把所有建立的连接都放在全局变量_CONNECTIONS里,如果在关闭的时候不从这个列表里取出(减少引用)则connection对象就不会被回收,则每建立一次连接就会有个连接对象和连接对象引用的对象不会被回收. 如果把对象放在一个类属性里也是一样的,因为类对象在程序一开始就分配,并在程序退出时才被回收. 解决办法就是在退出时从列表(或其他对象)里解除对对象的引用(删除)对党的认识也有了进一步的提高。才真正体会到了中国共产党的伟大、光荣和正确,更感到只有中国共产党是全中国最广大人民利益的忠实代表我真正系统地接触和学
10、习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解 _CONNECTIONS=[] #... classConnection(object): def__init__(self,sock,address) pass defserver_loop(): #... sock,address=server_sock.accept() connection=Connection(sock,