Я недавно понял, что у моей программы есть утечка памяти, она маленькая, но, думаю, ее вообще не должно быть.
Часть, которая вызывает утечку памяти, фактически создает новый wx.Panel
и добавляет его в интерфейс, используя wx.WindowSplitter
, а затем удаляет панель и
разбивает окно.
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
un EditCondition
- это 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
Вывод выглядит следующим образом:
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
Как видите, используемая память увеличивается, но количество объектов не меняется после создания и удаления, я просто не понимаю, что может создать такую утечку памяти. Любые идеи были бы хорошы. За 45 минут использование памяти выросло с ~ 20 MB
до ~ 500 MB
.
P.S. Если кому-то интересно, исходный код созданных панелей можно найти по адресу: EditStatement EditCondition
P.S.S. Я не уверен, но я склонен думать, что это ошибка wx.Python, что-то с wx.SplitterWindow