擅长:python、mysql、java
<p>尺寸会无限增长吗?很少有程序(或库)将堆返回给系统,即使不再使用,CPython(2.7.3)也不例外。通常的罪魁祸首是<code>malloc</code>,它将按需增加进程内存,并在<code>free</code>上将空间返回到其空闲列表中,但从不从系统中取消分配它已请求的内存。此示例代码有意获取内存,并显示进程使用是有界和有限的:</p>
<pre><code>import resource
def maxrss(start, end, step=1):
"""allocate ever larger strings and show the process rss"""
for exp in range(start, end, step):
s = '0' * (2 ** exp)
print '%5i: %sk' % (exp,
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000)
# s goes out of scope here and is freed by Python but not returned
# to the system
try:
maxrss(1, 40, 5)
except MemoryError:
print 'MemoryError'
maxrss(1, 30, 5)
</code></pre>
<p>其中输出(在我的机器上)部分是:</p>
^{pr2}$
<p>这表明解释器无法从系统中获取2**36字节的堆,但仍有“手头”的内存来填充以后的请求。正如脚本的最后一行所示,内存是供Python使用的,即使它当前没有使用它。在</p>