python - 内存没有被回馈给内核

时间:2012-08-14 17:22:41

标签: python memory-management memory-leaks python-2.7

我有一个非常简单的脚本,在打印delsheapy报告的同时,分配内存pidstat是对相当大的对象的唯一引用。在运行脚本之后,heapy告诉我,当pidstat告诉我相反的情况时,应该没有多少内存被使用:

from guppy import hpy
import time
import sys
import os

'''
1) print heapy and pidstat report after starting and before actually doing any work
2) allocate some memory in a simple 2d array
3) print heapy and pidstat report
4) del the d2 array (attempt at garbage collection)
5) print heapy and pidstat report
6) sleep so pidstat can continue to be run to check on memory
'''

def pidstat(msg):
    print '==============================='
    print msg
    os.system('pidstat -r -p %s' % os.getpid())
    print '+++++++++++++++++++++++++++++++'
    print hpy().heap()[0]
    print '==============================='

pidstat('before doing anything')
docs = []
for doc in range(0, 10000):
    docs.append([j for j in range(0, 1000)])

pidstat('after fetching all the docs into memory')
del docs

pidstat('after freeing the docs')
time.sleep(60)

输出如下:

===============================
before doing anything
Linux 2.6.38-15-generic (hersheezy)     08/14/2012  _x86_64_    (4 CPU)

01:05:20 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
01:05:20 PM      5360      0.44      0.00   44768   9180   0.11  python
+++++++++++++++++++++++++++++++
Partition of a set of 19760 objects. Total size = 1591024 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  19760 100  1591024 100   1591024 100 str
===============================
===============================
after fetching all the docs into memory
Linux 2.6.38-15-generic (hersheezy)     08/14/2012  _x86_64_    (4 CPU)

01:05:21 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
01:05:21 PM      5360      8.95      0.00  318656 279120   3.49  python
+++++++++++++++++++++++++++++++
Partition of a set of 7431665 objects. Total size = 178359960 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0 7431665 100 178359960 100 178359960 100 int
===============================
===============================
after freeing the docs
Linux 2.6.38-15-generic (hersheezy)     08/14/2012  _x86_64_    (4 CPU)

01:05:29 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
01:05:29 PM      5360     40.23      0.00  499984 460480   5.77  python
+++++++++++++++++++++++++++++++
Partition of a set of 19599 objects. Total size = 1582016 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  19599 100  1582016 100   1582016 100 str
===============================

如何确保将此内存返回给操作系统?

2 个答案:

答案 0 :(得分:3)

python进程内可以重用内存以及何时将其释放到操作系统之间可能存在差异。特别是,标准的Python解释器(CPython)为特定类型的对象维护自己的池和空闲列表。它将在这些池中重用内存,但一旦使用它就永远不会将其释放到操作系统中。

有关详细信息,请参阅this

答案 1 :(得分:1)

  

如何确保将此内存返回给操作系统?

一般不会。 Python在'arenas'中分配内存,即使在解释器中删除了引用,它也会保留在以后使用的内存区域。我认为如果它们完全是空的,那么在较新版本的python中有一种机制可以解开竞技场。但是你无法控制放置物体的位置。