[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    [PyKDE] Memory leak: Cycles with QObject's doesn't get collected
From:       Nahuel Greco <nahuel.greco () voiceovernet ! com ! ar>
Date:       2005-03-30 16:03:55
Message-ID: 20050330130355.35573272.nahuel.greco () voiceovernet ! com ! ar
[Download RAW message or body]

I think I have found another memory leak. When you create cycles with QObjects
they aren't collected. This doesn't happen with pure python objects (as
expected), but in that case I have found an strange behaviour when you set
the gc.DEBUG_SAVEALL flag (that isn't PyQT related, but take that in
account if you add gc debug flags). See the attached script and their logs.



Saludos,
Nahuel Greco.






["using_pure_python_class.log" (application/octet-stream)]
["using_qobject_class.log" (application/octet-stream)]
["test_qt_cycles.py" (text/x-python)]

#!/usr/bin/python
from qt import *
import sys, os, gc

######### Query Memory Usage Functions ####################################
def report(s):
    print s
    sys.stdout.flush()

def presentMemData(s=""):
    vmsize = vmrss = 0 
    for l in open('/proc/self/status','r').readlines():
        if l.startswith('VmSize:'):
            vmsize = int(l.split()[1])
        elif l.startswith('VmRSS:'):
            vmrss  = int(l.split()[1])
    report(s+"VmSize: %d Kb VmRss: %d Kb" % (vmsize,vmrss))
###########################################################################

TestClass = QObject

## If you uncomment the following line then the script dont leaks:
#class TestClass: pass

## Warning, if you uncomment the following line, then the script will leak
## even without using the QObject class. This is because the DEBUG_SAVEALL
## setting is enabled, but is strange because with that flag, only
## unreacheable objects (that is, objects with a __del__ method, see the
## gc module documentation) are saved, and that cant be the case of the
## QObject class or the pure python one.
#gc.set_debug(gc.DEBUG_LEAK | gc.DEBUG_STATS)


# This is enabled by default, just in case. 
gc.enable() 

# After this setting, gc.collect() will check all the generations
gc.set_threshold(1,1,1)

report("Is GC enabled?: %r" % gc.isenabled())
report("Has TestClass a __del__ method? (if True, it will be marked as unreachable): \
%r" % hasattr(TestClass(), '__del__')) report("PY Version:   "+ sys.version)
report("QT Version:   "+ qVersion())
report("PYQT Version: "+ PYQT_VERSION_STR)
report("SIP Version:  "+ os.popen('sip -V').read())
presentMemData()

for i in xrange(100):
    for j in xrange(50):
            a = TestClass()
            b = TestClass()
            a.payload = ("%r"%a)*100
            a.win = b
            b.win = a 
            # uncomment the following line when using QObject to disable the leak
            #b.win = None
            a = None  # redundant
            b = None  # redundant
            
    gc.collect()
    presentMemData("%03d " % i)



_______________________________________________
PyKDE mailing list    PyKDE@mats.imk.fraunhofer.de
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic