我的python代码进程内存动态增加,因为它在必要时将动态数据存储在列表,字典和元组中。虽然在那之后所有这些动态数据都在其变量中被物理清除,但内存并没有被击落。
因此,我觉得有一个内存泄漏,我使用gc.collect()方法收集所有不同意的内存。但是当变量中没有数据时,我无法将内存设置为最小值。
答案 0 :(得分:6)
一般来说,对于“将内存重新提供给操作系统”的过程来说非常困难(直到进程终止并且操作系统返回所有内存),因为(在大多数情况下)实现)malloc
返回的是为了提高效率而从大块中获取的,但是如果它的任何部分仍然在使用中,整个块都无法返回 - 因此,大多数C标准库甚至都没有尝试。
要在Python上下文中进行讨论,请参阅例如here。 Evan Jones修正了一些特定于Python的问题,如here和here所述,但是他的补丁在Python 2.5之后就在主干中了,所以你所观察到的问题肯定是系统malloc包,而不是Python本身。特定于2.6的说明是here和here。
一个SO线程是here,其中Hugh Allen在他的回答中引用了Firefox程序员,以至于Mac OS X是一个基本上不可能的系统,可以让一个进程恢复内存到操作系统。
因此,只有通过终止进程才能确保释放内存。例如,长时间运行的服务器可能会将其状态快照到磁盘并关闭(使用微小的监视程序进程,系统或自定义,监视它并重新启动它)。如果您知道下一个操作会在短时间内占用大量内存,通常可以os.fork
,在子进程中执行内存耗尽的工作,并将结果(如果有)返回到父进程子进程终止时通过管道。等等,等等。
答案 1 :(得分:0)
我们说话有多大? Python本身占用了大量内存..我相信可能达到30或40 MB。如果它大于那个并且没有被收集,则会发生内存泄漏。只能收集没有引用的垃圾,不知怎的,您的额外内容仍然被引用。做一个记忆档案,看看发生了什么。