使用wxPython的python内存泄漏
我最近意识到,我的程序有一个内存泄漏,它很小,但不管怎样,我认为它根本不应该存在 导致内存泄漏的部分实际上创建了一个新的使用wxPython的python内存泄漏,python,debugging,memory,wxpython,memory-leaks,Python,Debugging,Memory,Wxpython,Memory Leaks,我最近意识到,我的程序有一个内存泄漏,它很小,但不管怎样,我认为它根本不应该存在 导致内存泄漏的部分实际上创建了一个新的wx.Panel,并使用wx.windowspliter将其添加到接口中,然后删除Panel和un 拆分窗口 self.getAction(self, event): if self.lastEdit[0] != None: if self.lastEdit[4] == STATEMENT: dialog = EditStatem
wx.Panel
,并使用wx.windowspliter
将其添加到接口中,然后删除Panel和un
拆分窗口
self.getAction(self, event):
if self.lastEdit[0] != None:
if self.lastEdit[4] == STATEMENT:
dialog = EditStatement(self.API.editorSplitter,
self.API, self.lastEdit, self.statementUpdateClbk)
elif self.lastEdit[4] == CONDITION:
dialog = EditCondition(self.API.editorSplitter,
self.API, self.lastEdit, self.conditionUpdateClbk)
# Show or hide split window
self.splitEditor(dialog)
def splitEditor(self, editPanel):
self.API.editorSplitter.Unsplit()
if self.lastPanel != None:
self.lastPanel.DissociateHandle()
self.lastPanel.DestroyChildren()
self.lastPanel.Destroy()
self.lastPanel = editPanel
if editPanel != None:
self.API.editorSplitter.SplitVertically(self.API.tabManager,
editPanel, -305)
请注意,EditStatement
unEditCondition
是前面提到的wx.Panel
类别。在循环中调用getAction()
会随机增加内存使用,最奇怪的是,在某些迭代中没有变化,在某些迭代中使用的内存甚至会下降一点,但在大多数迭代中使用的内存会增加。下面是调试的一些输出,使用gc
模块包装器生成
用于测试的代码:
def cycler(self):
while True:
self.getAction(None) #Show window
wx.YieldIfNeeded()
self.mem() # prints memory information
self.splitEditor(None) #Hide window
wx.YieldIfNeeded()
self.mem() # prints memory information
结果如下:
正如您所看到的,已用内存正在增加,但对象计数在创建和删除后并没有改变,我只是不明白什么可能会造成这样的内存泄漏。任何想法都将不胜感激。在45分钟内,内存使用量从~20MB
增加到~500MB
另外,如果有人感兴趣,可在以下网址找到所创建面板的源代码:
顺便说一句,我不确定,但我倾向于认为这是wx.Python bug,它带有
wx.SplitterWindow
您是否能够创建尽可能小的完整的可运行代码来演示问题?@Fenikso不,我只是尝试过,但闪烁的面板似乎不起作用。但我深入研究了我的问题,在我看来,内存在其他线程中泄漏,这让我思考,因为我在应用程序的这一部分中不使用线程,而且我确信当时没有其他线程在运行,我唯一能想到的例外是如果wx使用线程,我对此表示怀疑,但我还没有检查。如果对象计数没有改变,我觉得wxWidgets实现中似乎有一个bug。但如果不孤立问题,可能就没有办法报告它。你的wxPython版本是什么?你试过另一个吗?
Window action - Action Object Count
Create Window - Added StaticText 10
Create Window - Changed dict +1
Create Window - Added GridBagSizer 1
Create Window - Changed list +2
Create Window - Added CheckBox 4
Create Window - Changed ComboBox +6
Create Window - Added EditStatement 1
Create Window - Changed BoxSizer +1
Create Window - Changed instancemethod +15
Create Window - Count = 25453
Create Window - Memory(rss): 42528
Destroy Window - Changed dict -1
Destroy Window - Changed list -2
Destroy Window - Changed ComboBox -6
Destroy Window - Changed BoxSizer -1
Destroy Window - Changed instancemethod -15
Destroy Window - Deleted StaticText 10
Destroy Window - Deleted GridBagSizer 1
Destroy Window - Deleted CheckBox 4
Destroy Window - Deleted EditStatement 1
Destroy Window - Count = 25412
Destroy Window - Memory(rss): 42528
Create Window - Added StaticText 10
Create Window - Changed dict +1
Create Window - Added GridBagSizer 1
Create Window - Changed list +2
Create Window - Added CheckBox 4
Create Window - Changed ComboBox +6
Create Window - Added EditStatement 1
Create Window - Changed BoxSizer +1
Create Window - Changed instancemethod +15
Create Window - Count = 25453
Create Window - Memory(rss): 42536
Destroy Window - Changed dict -1
Destroy Window - Changed list -2
Destroy Window - Changed ComboBox -6
Destroy Window - Changed BoxSizer -1
Destroy Window - Changed instancemethod -15
Destroy Window - Deleted StaticText 10
Destroy Window - Deleted GridBagSizer 1
Destroy Window - Deleted CheckBox 4
Destroy Window - Deleted EditStatement 1
Destroy Window - Count = 25412
Destroy Window - Memory(rss): 42540
Create Window - Added StaticText 10
Create Window - Changed dict +1
Create Window - Added GridBagSizer 1
Create Window - Changed list +2
Create Window - Added CheckBox 4
Create Window - Changed ComboBox +6
Create Window - Added EditStatement 1
Create Window - Changed BoxSizer +1
Create Window - Changed instancemethod +15
Create Window - Count = 25453
Create Window - Memory(rss): 42552
Destroy Window - Changed dict -1
Destroy Window - Changed list -2
Destroy Window - Changed ComboBox -6
Destroy Window - Changed BoxSizer -1
Destroy Window - Changed instancemethod -15
Destroy Window - Deleted StaticText 10
Destroy Window - Deleted GridBagSizer 1
Destroy Window - Deleted CheckBox 4
Destroy Window - Deleted EditStatement 1
Destroy Window - Count = 25412
Destroy Window - Memory(rss): 42556
Create Window - Added StaticText 10
Create Window - Changed dict +1
Create Window - Added GridBagSizer 1
Create Window - Changed list +2
Create Window - Added CheckBox 4
Create Window - Changed ComboBox +6
Create Window - Added EditStatement 1
Create Window - Changed BoxSizer +1
Create Window - Changed instancemethod +15
Create Window - Count = 25453
Create Window - Memory(rss): 42576