Python 内存使用量不下降

问题描述 投票:0回答:1

我正在编写一个扭曲的 PB 应用程序,它似乎使用了大量内存,当用户断开连接时,这些内存似乎永远不会被释放。

我有一个 pb.Root 对象,客户端连接到该对象并调用一个返回 pb.Referenceable 对象的远程方法,该对象在创建时将大量信息读入内存(大约 2GB 的数据)以加快操作速度。该对象以及有关客户端的一些其他信息被插入到列表中。

当客户端与服务器断开连接时,我对此对象调用一些清理操作,以删除对正在存储的缓存对象的引用。 chunkCache 是我存储数据的字典。

def disconnected(self):
    self.connected = False
    self.chunkCache = None
    self.cur.close()

一旦客户端断开连接,内存使用情况根据 top 永远不会下降,它仍然显示 2Gb。

我应该担心这个问题,还是会在需要时释放分配的内存,或者如果没有任何想法,我如何释放这些内存?它是在创建对象时创建的,不会传递到其他任何地方。

在该对象内部,我确实有一个 deferToThread 调用,这是否会阻止正在释放的项目?

我在 Linux 上使用 python 2.7。

更新:

我很困惑,我刚刚向我的对象添加了自定义

__del__
方法,并在其中放置了打印语句,它们正在被删除,那么为什么内存使用量永远不会下降?

谢谢

院长

python python-2.7 memory twisted perspective-broker
1个回答
3
投票

在大多数当前操作系统上,动态内存的分配发生在通常称为堆的地方(不要与同名的数据结构混淆),堆本质上只是一个从某个基地址开始并延伸到基地址加上堆的当前大小。进程从一个小堆开始(通常只有几页),并根据需要通过以系统页大小的正整数倍为单位向上扩展段来增长。在该空间内,分配/释放会创建较小的内存块来满足程序的需求,以及分配器需要跟踪哪些内存已分配、哪些未分配的元数据。这些较小的内存块可能会随着时间的推移而被释放,使堆段基本上为空,但除非经过专门编码,否则堆段很少会收缩。因此,长时间运行的进程往往会出现与峰值使用量一样大的堆段。如果需要为其他进程释放物理内存,则正在使用但不再使用的页面往往会被移出以进行交换,但进程映像仍然看起来“很大”,并且通常不会缩小无需重新启动。有一些方法可以使用其他内存分配机制(例如,映射内存空间的临时文件并在完成后取消映射和删除它),但需要对程序进行专门编码才能执行此操作。使用标准库分配例程(分别为

malloc
/
free
new
/
delete
)编写的 C 或 C++ 应用程序(包括 Python 编译器/解释器)往往会表现出上述行为。

© www.soinside.com 2019 - 2024. All rights reserved.