[Zope-dev] Sync.Synchronized and ever increasing refcounts on 2.2.4

Noel Duffy noel.duffy@propylon.com
Fri, 3 May 2002 16:15:08 +0100


Hi all,

In my Zope site I have classes derived from the mixin Sync.Synchronized,
because the objects derived from my classes must be thread-safe. Lately
I've being experiencing serious memory leaks, with the result that after
a couple of days Zopes memory usage reaches a couple of hundred megabytes in
size, and Zope stops responding.

In an attempt to track down the problem, I have been using the Zope debug
section of the management interface, and I noticed that the refcount of
Sync.Synchronized increases by about 200 everytime my site receives a 
get request. These reference counts never decrease.

To help me understand the problem, I wrote a small test harness consisting
of two files. The first, test1.py, looks like this:

import Sync

class foo(Sync.Synchronized):
	def __init__(self):
		print 'constuctor'
		
	def bar(self):
		print 'wibble'

# Create a singleton object. There should only be one of these.
foo_ob=foo()

## end of test1.py

The second file, test.py, looks like this:

import sys,Sync
import test1

count=0
while 1:
	count=count+1
	# call method bar on object foo_ob.
	test1.foo_ob.bar()
	print '%d - %d' % (count, sys.getrefcount(Sync.Synchronized))

## end of test.py

This code just imports test1, and makes lots of calls to the bar()
method of the single foo_ob.


The results of running test.py is 

constuctor
wibble
1 - 11
wibble
2 - 12
wibble
3 - 13
wibble
4 - 14
wibble
5 - 15
wibble
6 - 16
wibble
7 - 17
wibble
8 - 18
wibble
9 - 19
wibble
10 - 20
wibble
11 - 21
wibble
12 - 22
wibble
13 - 23
wibble
14 - 24
wibble
15 - 25
wibble
16 - 26
wibble
17 - 27
wibble
18 - 28
wibble
19 - 29
wibble
20 - 30
wibble
21 - 31
wibble
22 - 32
wibble
23 - 33
wibble
24 - 34
wibble
25 - 35
wibble
26 - 36
wibble
27 - 37
wibble
28 - 38
wibble
29 - 39

Note how the refcount for Sync.Synchronized keeps increasing.

I searched on Google about this, and found this message:

  http://cvs.zope.org/Zope/lib/python/ts_regex.py?sortby=log

which implies that there was a problem with refcounts. 

So, finally, we come to the question, or rather questions, since
there are two:

1. Why does the refcount of Sync.Synchronized keep increasing?
2. Am I chasing a red herring here? That is, does the "Top Refcounts"
part of the Zope Debug screen merely show that there is one instance
of an object, and N references, and consequently nothing to worry
about?. If so, is there a way I can find out how many real instances 
there are? 

Any advice greatly appreciated.

Thanks in advance,

Noel.