0

我实际上试图在我的 python gtk 应用程序中修复我的内存问题。

我已经阅读了很多关于 python 内存使用的文章,但我无法全部了解,所以我希望你能在这里帮助我。

因此,如果我启动我的应用程序并打开设置窗口,我的内存使用量为 32368 KB。

现在,如果我关闭设置窗口,内存使用量也是 32368 KB。

这是我如何打开和关闭设置窗口的代码示例:

主文件

...
    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 分析活动引用。这就是结果:

打开设置窗口

打开设置窗口

关闭设置窗口后

关闭设置后

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

4

2 回答 2

2

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

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

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

所以你根本不能指望通过删除一个对象来改变系统内存分配(即ps /任务管理器输出)。

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

于 2013-01-29T11:24:32.867 回答
0

我觉得这里没有错。你的Settings实例被释放后消失了,这是正常的。您如何测量内存使用情况?

于 2013-01-29T11:17:32.090 回答