Python GTK 内存分配问题
Posted
技术标签:
【中文标题】Python GTK 内存分配问题【英文标题】:Python GTK Memory allocation problems 【发布时间】:2013-01-29 10:57:18 【问题描述】:我实际上是在尝试在我的 python gtk 应用程序中修复我的内存问题。
我已经阅读了很多关于python中内存使用的文章,但我无法全部了解,所以我希望你能在这里帮助我。
因此,如果我启动我的应用程序并打开设置窗口,我的内存使用量为 32368 KB。
现在如果我关闭设置窗口,内存使用量也是 32368 KB。
这是我如何打开和关闭设置窗口的代码示例:
main.py
...
def show_settings(self):
self.settings = Settings()
self.settings.window.connect("destroy", self.clear_settings)
def clear_settings(self, widget, Data=None):
del self.settings
class Settings():
def __init__():
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
...
现在我尝试使用 objgraph 分析活动引用。结果是这样的:
打开设置窗口
关闭设置窗口后
有人可以帮助如何释放内存吗?
【问题讨论】:
【参考方案1】:Python 中的内存分配发生在多个级别。首先,内存是由 C 库的系统分配器组件从系统分配的(这将显示在 Unix ps 或 Windows task manager 给出的内存使用数据中)。然后,分配的内存由 C 库调用(如 malloc)以更小的块分配,而如果更小的块则由 Python 自己的内存分配器(用于存储对象)分配。此外,Python 为不同的对象维护不同的分配池(以优化某些对象,例如 str vs int)。
为了将内存返回给系统,它必须先由 Python 的分配器取消分配,然后再由 C 库的堆分配器和页面分配器取消分配。何时发生这种情况很难确定,因为它取决于许多因素,例如您运行的系统、C 库的版本、Python 自己的版本和您的应用程序的分配模式。
分配器通常会保留一些空闲内存(称为空闲列表),以便通过避免每次需要新内存时进行系统调用(代价高昂)来加快分配速度。每个分配器都会有一些阈值,这些阈值确定内存何时实际分配或释放到下一个级别。
所以你不能指望通过删除一个对象来改变系统内存分配(即 ps / task manager 输出)。
如果您有特定的内存分配问题,有些是巨大的临时对象,并且您希望随着时间的推移尽量减少内存使用量,那么您需要提出一个更具体的问题 :)
【讨论】:
【参考方案2】:我觉得这里没有错。你的Settings
实例被释放后消失了,这是正常的。您如何测量内存使用情况?
【讨论】:
每次我打开设置窗口,都会分配大约 18kB 的新内存(用 ps auxww 测量)。但它永远不会发布。现在如果你这样做几次,内存使用量会不断增加 很难正确测量内存使用情况,尤其是在涉及库时。对于“大局”测量,我使用ps -eo rss,cmd --sort=rss
在底部查看使用最多RSS 内存的应用程序。但是对于缓存、特殊的SLAB 内存分配器和所有其他内存管理的东西,我同意isedev 的观点,你不能想当然地认为释放一些内存会对内存消耗产生即时影响。
顺便说一句,您使用的是 Windows、Linux 还是其他?
所以没有什么特别的问题。在 Windows 上,直到最近的 GTK 2.24.14 出现了一些内存泄漏。以上是关于Python GTK 内存分配问题的主要内容,如果未能解决你的问题,请参考以下文章