【发布时间】:2013-03-05 12:05:53
【问题描述】:
我有几个关于以下示例中的内存使用的相关问题。
-
如果我在解释器中运行,
foo = ['bar' for _ in xrange(10000000)]我机器上使用的实际内存达到
80.9mb。那我,del foo实际内存下降,但仅限于
30.4mb。解释器使用4.4mb基线,那么不向操作系统释放26mb内存有什么好处?是不是因为 Python 在“提前计划”,认为你可能会再次使用那么多内存? 为什么要特别发布
50.5mb- 发布的数量是多少?有没有办法强制 Python 释放所有已使用的内存(如果您知道不会再使用那么多内存)?
注意
这个问题不同于How can I explicitly free memory in Python?
因为即使在解释器通过垃圾收集释放对象之后(使用或不使用gc.collect),这个问题主要涉及从基线增加的内存使用量。
【问题讨论】:
-
值得注意的是,这种行为并非特定于 Python。通常情况下,当一个进程释放一些堆分配的内存时,内存不会被释放回操作系统,直到进程终止。
-
您的问题涉及多个问题——其中一些是重复的,其中一些不适合 SO,其中一些可能是好问题。你是在问 Python 是否不释放内存,在什么情况下它可以/不可以,底层机制是什么,为什么要这样设计,是否有任何变通方法,或者完全是其他什么?
-
@abarnert 我结合了相似的子问题。回答您的问题:我知道 Python 会向操作系统释放一些内存,但为什么不释放全部内存以及为什么会释放这么多内存。如果在某些情况下它不能,为什么?还有什么解决方法。
-
@jww 我不这么认为。这个问题真的与为什么解释器进程在调用
gc.collect完全收集垃圾之后从未释放内存有关。