Python内存释放问题

在项目中遇到一个很糟糕的问题,运行一个Python服务脚本,把服务器跑死了,以前以为开的进程过多,进程中因批量处理,导致内存和交换分区耗光引起的。后来才发现,确实是内存和交换分区无空间导致的死机,但却不是因为多进程分析引起的。

从网上看了很多资料,相关信息并不多,最后确定是由于Python对大对象内存的释放引起的。在一个对象的引用计数减为0时,与该对象对应的析构函数就会被调用,但是要特别注意的是,调用析构函数并不意味着最终一定会调用free释放内存空间,如果真是这样的话,那频繁地申请、释放内存空间会使 Python的执行效率大打折扣。

Python内存管理规则:
del的时候,把list的元素释放掉,把管理元素的大对象回收到python对象缓冲池里.
由此可见:python内存管理虽然很优秀,但是比较消耗内存.

一般来说,Python中大量采用了内存对象池的技术,使用这种技术可以避免频繁地申请和释放内存空间。因此在析构时,通常都是将对象占用的空间归还到内存池中。

我查看到一句话:也许能够回答自己的问题.

“这个问题就是:Python的arena从来不释放pool。这个问题为什么会引起类似于内存泄漏的现象呢。考虑这样一种情形,申请10*1024*1024个16字节的小内存,这就意味着必须使用160M的内存,由于Python没有默认将前面提到的限制内存池的WITH_MEMORY_LIMITS编译符号打开,所以Python会完全使用arena来满足你的需求,这都没有问题,关键的问题在于过了一段时间,你将所有这些16字节的内存都释放了,这些内存都回到arena的控制中,似乎没有问题。但是问题恰恰就在这时出现了。因为 arena始终不会释放它维护的pool集合,所以这160M的内存始终被Python占用,如果以后程序运行中再也不需要160M如此巨大的内存,这点内存岂不是就浪费了?”

对Python内存释放的机制还不是太明白,继续学习中。



参考资料:
http://www.iteye.com/topic/309753
Why doesn’t Python release the memory when I delete a large object?
How does Python manage memory?
http://pythoner.net/wiki/96/
http://pythoner.net/wiki/56/

posted @ 2011-10-10 18:23  残夜  阅读(9464)  评论(0编辑  收藏  举报