python-内存没有返回给内核 [英] python - memory not being given back to kernel
问题描述
我有一个非常简单的脚本来分配内存,dels
是对大型对象的唯一引用,同时打印heapy
和pidstat
报告.运行脚本后,heapy告诉我应该不使用太多内存,而pidstat告诉我相反:
I have a very simple script that allocates memory, dels
the only reference to a sizable object, all the while printing heapy
and pidstat
reports. After running the script, heapy tells me that there should not be much memory being used while pidstat tells me the opposite:
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
===============================
如何确定此内存已返回操作系统?
How can I make sure this memory is returned to the operating system?
推荐答案
何时在python
进程内提供可重用的内存与何时将内存释放到OS之间可能会有差异.特别是,标准的Python解释器(CPython)维护其自己的池和用于特定类型对象的空闲列表.它会在这些池本身中重用内存,但是一旦使用过,就永远不会将其释放到操作系统中.
There can be a difference between when memory is made available for reuse inside the python
process and when it is released to the OS. In particular, the standard Python interpreter (CPython) maintains its own pools and free lists for particular kinds of objects. It will reuse memory in these pools itself, but never releases it to the OS once it's been used.
请参见这以获取更多详细信息.
See this for more details.
这篇关于python-内存没有返回给内核的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!