Hi, I _think_ Robert is right and ThreadLocals are not the problem (I tried getting rid of them, and replacing them with an instance var last week, but run into problems with multi-threaded unit tests). What I'm seeing while profiling (and in production) is the accumulation of these:
org.apache.lucene.search.FieldCacheImpl$Entry org.apache.lucene.search.FieldCacheImpl$CreationPlaceholder This is related to http://issues.apache.org/jira/browse/LUCENE-651 (the commit for that patch also happens to coincide with when I started seeing the leak). The number of those 2 FieldCache* instances seems to be about 2 x # of unique IndexReaders (indices) that have been searched so far. I reversed that LUCENE-651 patch locally, and now I am *not* seeing the number of FieldCacheImpl$Entry instances grow any more! Hm, hm, hm, hm. :) FieldCacheImpl$CreationPlaceholder came with LUCENE-651, so I'm not seeing any of them, of course. I _think_ the reason I see this leak and most other people don't, is because I'm running an application with LOTS of frequently-changing indices (look at http://simpy.com ). That FieldCacheImpl$CreationPlaceholder uses IndexReaders as keys in a WeakHashMap *and* another HashMap. Even though I close my IndexSearchers and they close their underlying IndexReaders, I think FieldCacheImpl is holding onto them, thus not allowing them to be GCed. Here is what the dump of my production heap is showing right now, for instance: $ jmap -histo:live `jps | grep Server | awk '{print $1}'` | grep SegmentReader 46: 6630 583440 org.apache.lucene.index.SegmentReader $ jmap -histo:live `jps | grep Server | awk '{print $1}'` | grep MultiReader 110: 735 41160 org.apache.lucene.index.MultiReader $ jmap -histo:live `jps | grep Server | awk '{print $1}'` | grep FieldCache 74: 7444 178656 org.apache.lucene.search.FieldCacheImpl$Entry 85: 7434 118944 org.apache.lucene.search.FieldCacheImpl$CreationPlaceholder 6630 + 735 = 7365 ~ 7434 But, like I said, I'm closing IndexSearchers (and they are closing their IndexReaders), so there are only 114 open of them at the moment: $ jmap -histo:live `jps | grep Server | awk '{print $1}'` | grep IndexSearcher 337: 114 2736 org.apache.lucene.search.IndexSearcher So, I think that LUCENE-651 introduced a bug. I think the reason why Robert and others are not seeing this is because 1) few people are using 2.1-dev AND 2) running apps with LOTs of indices. If I had an app with a single or a handful of indices, I would probably never have noticed this leak. Can anyone else have a look at the patch for LUCENE-651 (or just at FieldCacheImpl) and see if there is a quick fix? Also, wouldn't it be better if IndexReaders had a reference to their copy FieldCache, which they can kill when they are closed? What we have now is a chunky FieldCacheImpl that has references to IndexReaders, and doesn't know when they are closed, and thus it can't remove them and their data from its internal caches? Thanks, Otis ----- Original Message ---- From: Mark Miller <[EMAIL PROTECTED]> To: java-dev@lucene.apache.org Sent: Sunday, December 17, 2006 9:22:05 PM Subject: Re: ThreadLocal leak (was Re: Leaking org.apache.lucene.index.* objects) I think that Otis originally said that the problem came up when he started using the latest build off of the trunk. I don't believe he experienced the problem on 2.0. Anyone on the bleeding edge not noticing the leak? I am going to be deploying with 2.trunk soon and am very interested <G>. robert engels wrote: > Our search server also used long-lived threads. No memory problems > whatsoever. > > On Dec 17, 2006, at 3:51 PM, Paul Smith wrote: > >> >> On 16/12/2006, at 6:15 PM, Otis Gospodnetic wrote: >> >>> Moving to java-dev, I think this belongs here. >>> I've been looking at this problem some more today and reading about >>> ThreadLocals. It's easy to misuse them and end up with memory >>> leaks, apparently... and I think we may have this problem here. >>> >>> The problem here is that ThreadLocals are tied to Threads, and I >>> think the assumption in TermInfosReader and SegmentReader is that >>> (search) Threads are short-lived: they come in, scan the index, do >>> the search, return and die. In this scenario, their ThreadLocals go >>> to heaven with them, too, and memory is freed up. >> >> Otis, we have an index server being served inside Tomcat, where an >> Application instance makes a search request via vanilla HTTP post, so >> our connector threads definitely do stay alive for quite a while. >> We're using Lucene 2.0, and our Index server is THE most stable of >> all our components, up for over month (before being taken down for >> updates) searching hundreds of various sized indexes sized up to 7Gb >> in size, serving 1-2 requests/second during peak usage. >> >> No memory leak spotted at our end, but I'm watching this thread with >> interest! :) >> >> cheers, >> >> Paul Smith > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]