【发布时间】:2013-05-03 20:13:59
【问题描述】:
我正在为 Python 2.7 使用最新版本的 PyGTK All-in-One 安装程序 (2.24.2),其中包括 Cairo 1.10.8、Pango 1.29.4、PyGTK 2.24.0 和 PyGobject 2.28.3 (我认为)。
以下代码泄漏了约 55 MB 的内存:
import gtk
window = gtk.Window()
label = gtk.Label()
window.add(label)
window.show_all()
for _ in range(100000):
label.set_markup('Leaking memory!')
while gtk.events_pending():
gtk.main_iteration()
注意:for 循环在我的测试脚本中,所以我可以在任务管理器中看到内存消耗增加。它本质上也是我的实际应用程序中发生的事情,除了标签文本每秒至少更改一次,而不是每次都用相同的文本重绘。
问题行是label.set_markup(),每次调用泄漏大约 0.5kB,所以我怀疑问题出在 GTK 或开罗的某个地方。正如评论者指出的那样,它可能是this bug (685959)。
我尝试使用 objgraph 来查看是否有任何额外的 Python 对象与调用 gtk.Label.set_markup() 的次数成正比,但没有多余的对象。因此,对gc.collect() 的调用无济于事,我尝试确定。 Python 似乎不知道负责内存消耗的对象。
我如何找到这个内存泄漏,和/或解决它?我需要使用标记为这个应用程序设置一些文本的样式,但我尝试使用gtk.Label.set_text() 作为解决方法,但它也会泄漏内存。
我应该注意这个应用程序以 Windows 为目标,因此使用 PyGObject 来获取 GTK 3 不是一种选择 -- GObject 内省仍然在 Windows 上不可用。
【问题讨论】:
-
缩进正确吗?只要每次设置标签后都有事件,您就一直在运行 gtk.main_iteration()?
-
是的,这是正确的做法。这基本上把主循环翻过来了。
-
@Series8217 我明白了。我刚刚在 Linux/GTK 2 上尝试过,在无限循环中,内存在一段时间后从 19.8MB 变为 20.1MB 并保持在那里。只是我的 2 美分,我无能为力了 :)
-
@user4815162342 看起来可能是 685959。不幸的是,似乎已经有一段时间没有人发布与我的环境兼容的版本了。