Python GTK内存分配问题

时间:2013-01-29 10:57:18

标签: python memory gtk objgraph

我实际上试图在我的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分析活着的引用。结果就是这样:

打开设置窗口

Open Settings Window

关闭设置窗口后

After closing settings

有人可以帮忙解释如何释放内存吗?

2 个答案:

答案 0 :(得分:2)

Python中的内存分配发生在多个级别。首先,内存是由C库的系统分配器组件从系统分配的(这将显示在Unix ps 或Windows 任务管理器给出的内存使用数据中) )。然后,通过C库调用(例如 malloc )将分配的内存分配到较小的块中,而这些库调用又由Python自己的内存分配器(用于存储对象)分配更小的块。此外,Python为不同的对象维护不同的分配池(以优化某些对象,例如 str vs int )。

对于要返回给系统的内存,它必须由Python的分配器取消分配,然后由C库的堆分配器和页面分配器取消分配。发生这种情况很难确定,因为它取决于许多因素,例如您运行的系统,C库的版本,Python自己的版本以及应用程序的分配模式。

分配器通常保留一些空闲内存(称为空闲列表),以便通过避免每次需要新内存时进行系统调用(这是昂贵的)来加速分配。每个分配器都有一些阈值,用于确定何时实际分配内存或释放到下一级别。

因此,您不能指望通过删除对象来查看系统内存分配(即 ps / 任务管理器输出)。

如果您有特定的内存分配问题,有些是大型临时对象,并且您希望随着时间的推移缩减内存使用量,那么您需要提出更具体的问题:)

答案 1 :(得分:0)

我认为这里没有错。您的Settings实例在被释放后已经消失,这是正常的。你是如何衡量内存使用情况的?