当前位置: 首页 > 面试题库 >

python-内存未归还内核

欧阳成弘
2023-03-14
问题内容

我有一个非常简单的脚本,dels该脚本在打印heapypidstat报告的同时分配内存,这是对大型对象的唯一引用。运行脚本后,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)

输出如下:

===============================
在做任何事情之前
Linux 2.6.38-15-generic(hersheezy)2012年08月14日_x86_64_(4 CPU)

01:05:20 PM PID minflt / s majflt / s VSZ RSS%MEM命令
01:05:20 PM 5360 0.44 0.00 44768 9180 0.11蟒蛇
+++++++++++++++++++++++++++++++++
一组19760个对象的分区。总大小= 1591024字节。
 索引计数%大小%累积%种类(类/类的字典)
     0 19760 100 1591024 100 1591024 100条
===============================
===============================
将所有文档提取到内存中之后
Linux 2.6.38-15-generic(hersheezy)2012年08月14日_x86_64_(4 CPU)

01:05:21 PM PID minflt / s majflt / s VSZ RSS%MEM命令
01:05:21 PM 5360 8.95 0.00 318656 279120 3.49蟒蛇
+++++++++++++++++++++++++++++++++
一组7431665对象的分区。总大小= 178359960字节。
 索引计数%大小%累积%种类(类/类的字典)
     0 7431665 100 178359960 100 178359960 100整数
===============================
===============================
释放文档后
Linux 2.6.38-15-generic(hersheezy)2012年08月14日_x86_64_(4 CPU)

01:05:29 PM PID minflt / s majflt / s VSZ RSS%MEM命令
01:05:29 PM 5360 40.23 0.00 499984 460480 5.77蟒蛇
+++++++++++++++++++++++++++++++++
一组19599个对象的分区。总大小= 1582016字节。
 索引计数%大小%累积%种类(类/类的字典)
     0 19599 100 1582016 100 1582016 100条
===============================

如何确定该内存已返回操作系统?


问题答案:

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

请参阅此了解更多详情。



 类似资料:
  • 为了降低RSS,我正在Java8上运行不同jvm选项的实验: > 用于Rss跟踪的脚本: 用于设置java进程的JVM args: 与JCMD进行差异:

  • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?

  • 问题内容: 是否有一个Python库,可以在不使用实际磁盘文件的情况下操纵内存中的zip存档? ZipFile库不允许您更新存档。唯一的方法似乎是将其提取到目录中,进行更改,然后从该目录中创建新的zip。我想修改没有磁盘访问权限的zip归档文件,因为我将下载它们,进行更改并再次上传它们,因此没有理由存储它们。 尽管几乎没有任何接口可以避免磁盘访问,但类似于Java的ZipInputStream /

  • 问题内容: 我有一个长时间运行的脚本,如果让脚本运行足够长的时间,它将消耗系统上的所有内存。 在不详细介绍脚本的情况下,我有两个问题: 是否有可遵循的“最佳实践”,以防止泄漏发生? 有什么技术可以调试Python中的内存泄漏? 问题答案: 看看这篇文章:跟踪python内存泄漏 另外,请注意,垃圾收集模块实际上可以设置调试标志。看一下功能。此外,请查看Gnibbler的这段代码,以确定调用后已创建

  • 问题内容: 基于 http://redis.io/topics/faq Redis是内存中的,但是持久存储在磁盘数据库上。 那么我是否知道Redis将键/值保存在内存或磁盘中?或两者? 在Redis中写入值时,它是否同时写入内存和磁盘? 谢谢你的概念。 问题答案: 根据配置方式的不同,redis可以定期将现有状态备份到磁盘,但否则,所有内容都在内存中。

  • 问题内容: 我正在编写自动化脚本(/ )。他们中的许多人都受益于一些基本的终端GUI。我想我会使用标准序列进行基本绘图。在绘制终端之前,我会这样做,但是这样做会丢失一些终端命令历史记录。我希望能够在程序存在时还原终端命令历史记录。许多终端程序(例如,,,,,,等)这样做。所有这些都还原了终端窗口,从而使用户返回到先前执行过的所有命令历史的调用程序之前的位置。 老实说,我什至不知道从哪里开始搜索。是