我使用Python 2.7的最新版PyGTK一体化安装程序(2.24.2),其中包括开罗1.10.8,Pango 1.29.4 ,PyGTK 2.24.0和PyGobject 2.28.3(我认为)。在重绘标签时解决GTK中的大内存泄漏
下面的代码泄漏〜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的某处。正如一位评论者指出的,它可能是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()? – pcurry 2013-05-03 20:17:46
是的,那是正确的做法。这基本上将主循环从内部转出。 – 2013-05-03 20:19:04
@ Series8217什么是for循环? – jadkik94 2013-05-03 20:25:50