Hi Tim,

 

Thanks for your suggestions; I have changed the maxThreads default to “10”
and copied the workerService into a local variable in the BaseHelper#stop()
method.

 

Could you give more details about the way we should configure the task queue
? The Javadocs of ThreadPoolExecutor suggest that a SynchronizedQueue is a
good default choice.

 

Regarding the thread pool sharing, I agree and entered a RFE:

http://restlet.tigris.org/issues/show_bug.cgi?id=1143

 

Best regards,
Jerome Louvel
--
Restlet ~ Founder and Technical Lead ~  <http://www.restlet.org/>
http://www.restlet.org
Noelios Technologies ~  <http://www.noelios.com/> http://www.noelios.com

 

 

 

 

De : [email protected] [mailto:[email protected]] De la part de Tim
Peierls
Envoyé : jeudi 24 juin 2010 17:40
À : [email protected]
Objet : Re: ClientResource leaves inactive thread

 

What was the date of that snapshot? It looks like there's a fix as of June
11, revision 6696 in svn.

 

But (talking to Jerome and Thierry now) I'm a little worried that this fix
isn't really addressing the heart of the problem. In particular, the use of
thread pool per BaseHelper instance prevents efficient re-use of threads in
the JVM. 

 

Also, defaulting coreThreads=1 and maxThreads=255 with a SynchronousQueue
seems like it's asking for trouble with CPU count << 255. What about a
bounded queue with high capacity to get through the bursts, but keep the
pool size to some small multiple of the CPU count? Remember that core size
is _not_ really min size.

 

(And a minor nit: BaseHelper.workerService is a volatile instance field, so
visibility isn't problem, but there are some atomicity issues -- at init
time and shutdown time. Fix to the latter just means copying volatile value
to local variable before testing and using. Fixing former ... needs some
thought. Maybe it's OK as is.)

--tim

 

On Tue, Jun 22, 2010 at 6:02 AM, Nina Jeliazkova <[email protected]> wrote:

Hello All,

I am experiencing memory/thread leak ,with Restlet-2.0-RC4 and
Restlet-2.0-SNAPSHOT , when using ClientResource . Basically, ClientResource
doesn't close the thread it spawns and this result in number of inactive
threads and  severe memory leak.

Here is some very simple code to illustrate this behaviour.  The same code
runs fine in Restlet-2.0-M6 (which doesn't span new thread in
ClientResource).

    public void run(int instances) throws Exception {        
        
        for (int i=0; i < instances;i++) { 
            ClientResource clientResource = null;
            Representation r = null;
            try {
                clientResource = new ClientResource( <http://restlet.org>
"http://restlet.org";);
                r = clientResource.get();
            } finally {
                try { r.release(); } catch (Exception x) {}
                try { clientResource.release(); } catch (Exception x) {}
            }
        }
    }
    
    public static void main(String[] args) throws Exception {
        ThreadTest test = new ThreadTest();
        test.run(1000);
    }


I guess there might be something missing in the code to explicitly close
threads, but since the same code runs fine in M6, it is quite confusing to
experience leaks after upgrade.

Best regards,
Nina Jeliazkova

P.S. Inactive threads while executing the example above

Erreur ! Nom du fichier non spécifié.

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2628675

Reply via email to