lucene-lucene-net-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Ben West (JIRA)" <>
Subject [jira] Commented: (LUCENENET-358) CloseableThreadLocal memory leak in LocalDataStoreSlot (with workaround)
Date Fri, 07 May 2010 17:29:48 GMT


Ben West commented on LUCENENET-358:

Could we re-open this? I ran the profiler on a test app which just searches for random strings
over and over again, and I found that half (!!) of the time was spent on the line AllocateDataSlot()
and another 25% on Thread.SetData(). I'm just using a vanilla IndexSearcher. (By way of comparison,
BinaryReader.Read() took only .5% of the total time.)

The documentation (
says "For better performance, use fields that are marked with the ThreadStaticAttribute attribute

I can't get a patch to pass those tests either, but perhaps someone who knows more about the
code could improve the performance here while still maintaining functionality? 

> CloseableThreadLocal memory leak  in LocalDataStoreSlot (with workaround)
> -------------------------------------------------------------------------
>                 Key: LUCENENET-358
>                 URL:
>             Project: Lucene.Net
>          Issue Type: Bug
>         Environment: Microsoft WIndows Server 2008 Enterprise x64. SP2.
> .NET Framework 4.0
>            Reporter: Rezgar Cadro
>            Priority: Critical
>         Attachments: CloseableThreadLocal MemoryLeak.patch
> Recently we have been suffering from a severe memory leak when executing intense open/close
operations on IndexSearcher and IndexModifier. 
> Memory profiling showed that memory is being held by LocalDataStore[] objects.
> After some digging, the root of the problem has been found in CloseableThreadLocal class:
> private System.LocalDataStoreSlot t = System.Threading.Thread.AllocateDataSlot();
> What we see is that every instantiated object of CloseableThreadLocal causes new data
slot allocation performed for every thread. 
> Thread.AllocateDataSlot() does not simply allocate a new slot, replacing an old one,
but enlarging an existing buffer in-thread, appending data to the end of internal LocalDataStore[]
collection, which  causes a severe memory leak .
> As long as "t" variable is instantiated on every object creation, and (in current class
implementation) every object is used by a single thread, replacing "private System.LocalDataStoreSlot
t = System.Threading.Thread.AllocateDataSlot();" with simple "private object dataSlot;" and
removing "hardRefs" Dictionary solves the problem and prevents memory leak. 
> We have tried to implement the expected behavior by using [ThreadStatic] attribute instead
of LocalDataStoreSlot, but the attempt failed because of unexpected exceptions being thrown.
> Patch can be found at Lucene.Net repository under 

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message