我正在为 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 或 Cairo 的某个地方。正如评论者所指出的,这可能是这个错误 (685959) 。
我尝试使用 objgraph 来查看是否有任何额外的 Python 对象与调用次数成正比,gtk.Label.set_markup()
但没有多余的对象。随之而来的是呼吁gc.collect()
不要帮助,我尝试确定。Python 似乎不知道负责内存消耗的对象。
我如何找到这个内存泄漏,和/或解决它?我需要使用标记来为这个应用程序设置一些文本的样式,但我尝试使用gtk.Label.set_text()
它作为一种解决方法,它也会泄漏内存。
我应该注意这个应用程序以 Windows 为目标,因此使用 PyGObject 来获取 GTK 3 不是一种选择——GObject 内省在 Windows 上仍然不可用。