<div dir="ltr">Hi,<div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 8, 2015 at 10:42 AM, Andreas Pakulat <span dir="ltr"><<a href="mailto:apaku@gmx.de" target="_blank">apaku@gmx.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hi Phil,<div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Tue, Apr 7, 2015 at 9:55 PM, Phil Thompson <span dir="ltr"><<a href="mailto:phil@riverbankcomputing.com" target="_blank">phil@riverbankcomputing.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div>On 07/04/2015 8:47 pm, Andreas Pakulat wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Hi,<br>
<br>
I'm having a small 'systray' application that monitors a jenkins service<br>
and it seems there's some kind of memory leak, especially on MacOSX. After<br>
having it run for a while (with the machine going to sleep now and again)<br>
it starts eating quite some memory - if I understand top/ActivityMonitor<br>
correctly - and amd wondering now how I'd best debug a PyQt application's<br>
memory consumption.<br>
<br>
So what tools do you guys usually use to debug such memory leaks? I've<br>
tried valgrind on Linux but there's no good hint there, possibly also due<br>
to the way Python works.<br>
</blockquote>
<br></div></div>
You could try a debug version of Python that will track objects. If that shows objects are not being collected then it is probably a PyQt problem. Otherwise it might be more likely to be a Qt problem.</blockquote><div><br></div></span><div>I'll check that option if I can determine its not my own code hanging on to objects it shouldn't hang onto anymore...</div></div></div></div></blockquote><div><br></div><div>So, it seems like I'm leaking QAction's and they're not garbage-collected for quite a while even when they're not connected to anymore anymore. I can 'fix' the problem by setting their parent QObject to None and explicitly calling gc.collect, without the latter the objgraph module (<a href="http://mg.pov.lt/objgraph.py">http://mg.pov.lt/objgraph.py</a>) shows them as  objects without any references to them even after another minute of the application running.</div><div><br></div><div>Maybe a little background on what the app does helps to understand this a little better. It polls a jenkins instance for states of the various jobs and for each job a QAction is created and added to the menu of a QSysTray object. Each time the data is retrieved all existing QActions are removed from teh menu via removeAction and the dictionary that kept the instances is cleared. Then a new set of actions is created and added to the menu for the possibly-changed set of jobs and their changed icons. The parent object of the actions is the systray's menu, hence having to set their parent to None when I want to get rid of them makes sense.</div><div><br></div><div>What I find surprising though is that Python's gc does not clean them up even after a while unless I explicitly call gc.collect. Does someone have an explanation for this?</div><div><br></div><div>Andreas</div></div></div></div>