Do you mean the warnings Mark Thomas built in in tomcat-6.0.25 which are meant as helpers to detect possible mem leaks and other programming errors? Maybe this is currently assumes jdk-1.4 only where the remove() didn't exist?
The tip to use ThreadLocal#remove() instead ThreadLocal#set(null) is from what I remember back at the time jdk-1.5 got introduced and a few blogs from pretty good people: http://crazybob.org/2006/07/hard-core-java-threadlocal.html http://www.0xcafefeed.com/2004/06/of-non-static-threadlocals-and-memory/ http://mail-archives.apache.org/mod_mbox/tapestry-dev/200606.mbox/%[email protected]%3e maybe we should use set(null) and then remove()? The cost for it should not be too high, but otoh I'd like to back this first with a unit test. Or is any expert in this area around who can shed a light on this? txs and LieGrue, strub ----- Ursprüngliche Mail ---- > Von: Gurkan Erdogdu <[email protected]> > An: [email protected] > Gesendet: Freitag, den 23. April 2010, 18:50:29 Uhr > Betreff: Re: AW: svn commit: r937336 - in > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: > component/ conversation/ el/ portable/creation/ spi/se/ > > Mark, I changed those to set(null) after that Tomcat stops to give > warnings, but not sure this is correct, so I will also add remove > methods. Thanks; --Gurkan ________________________________ From: > Gurkan Erdogdu < > href="mailto:[email protected]">[email protected]> To: > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected] Sent: > Fri, April 23, 2010 6:59:19 PM Subject: Re: AW: svn commit: r937336 - in > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: > component/ > conversation/ el/ portable/creation/ spi/se/ Actually if you do not call > set(null) you are getting lots of memory leak, I have tried with Tomcat 6.26. > Actually non-of them provides clean memory leak because of GC algorithms > etc. But If you really insist and ensure on this, you can > update Thanks; ________________________________ From: > Mark Struberg < > href="mailto:[email protected]">[email protected]> To: > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected] Sent: > Fri, April 23, 2010 6:46:58 PM Subject: AW: svn commit: r937336 - in > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: > component/ > conversation/ el/ portable/creation/ spi/se/ please revert all the > ThreadLocal.set(null) back to ThreadLocal.remove() because set(null) is known > to > produce memory leaks (That was actually the reason why remove() got > introduced > in jdk-1.5. txs and LieGrue, strub ----- > Ursprüngliche Mail ---- > Von: " > href="mailto:[email protected]">[email protected]" < > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]> > An: > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected] > > Gesendet: Freitag, den 23. April 2010, 17:32:56 Uhr > Betreff: svn commit: > r937336 - in > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: > component/ > conversation/ el/ portable/creation/ spi/se/ > > Author: > gerdogdu Date: Fri Apr 23 15:32:55 2010 New Revision: > > 937336 URL: > target=_blank > > > href="http://svn.apache.org/viewvc?rev=937336&view=rev" target=_blank > >http://svn.apache.org/viewvc?rev=937336&view=rev Log: Update while > > running sample applications. Modified: > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java > > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java > > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java > > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java > > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java > > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java > > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java > > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java Modified: > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java > > > Fri Apr 23 15:32:55 2010 @@ -233,7 +233,7 @@ public abstract class > > AbstractOwbBean<T> > > e.printStackTrace(); }finally > > { - > > CreationalContextImpl.currentRemoveObject.remove(); + > > > > CreationalContextImpl.currentRemoveObject.set(null); > > } } Modified: > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionPointBean.java > > > Fri Apr 23 15:32:55 2010 @@ -46,7 +46,7 @@ public class > InjectionPointBean > extends > > }finally > { - > > local.remove(); + > > local.set(null); } > > } Modified: > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java > > > Fri Apr 23 15:32:55 2010 @@ -263,7 +263,7 @@ public class > > ProducerMethodBean<T> exten > > } else > > { - > > > > AbstractInjectable.dependentInstanceOfProducerMethods.remove(); + > > > > AbstractInjectable.dependentInstanceOfProducerMethods.set(null); > > } > } > Modified: > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java > > > Fri Apr 23 15:32:55 2010 @@ -41,7 +41,7 @@ public class > ConversationImpl > implements /**Transient or not. > Transient conversations are > destroyed at the end of JSF > request*/ private boolean > isTransient = > true; - /**Default timeout is > 3mins*/ + > /**Default timeout is 30mins*/ > private long > timeout = 30 * 60 * 1000 ; /**Id of the > session > that this conversation is created*/ @@ -61,6 +61,7 @@ public class > > ConversationImpl implements */ public > > ConversationImpl() { + > > } /** @@ -72,7 +73,6 @@ > public > class ConversationImpl implements { > > Asserts.assertNotNull(sessionId); > > this.sessionId = sessionId; - > } > /** Modified: > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java > > > Fri Apr 23 15:32:55 2010 @@ -13,8 +13,8 @@ */ package > > org.apache.webbeans.conversation; +import > java.util.Collection; > import java.util.Iterator; -import > java.util.Map; import > java.util.Set; import > java.util.concurrent.ConcurrentHashMap; @@ > -76,19 +76,16 @@ > public class ConversationManager > */ > public boolean isConversationExistWithGivenId(String > > conversationId) { - synchronized > > (conversations) - { - > > ConversationImpl conv = null; - > > Set<Conversation> set = > > conversations.keySet(); - > > Iterator<Conversation> it = set.iterator(); + > > ConversationImpl conv = null; + > > Set<Conversation> set = conversations.keySet(); + > > Iterator<Conversation> it = > set.iterator(); - > while > (it.hasNext()) + > while > (it.hasNext()) + { + > > conv = (ConversationImpl) it.next(); + > > if > (conv.getId().equals(conversationId)) > > { - > > conv = (ConversationImpl) it.next(); - > > if > > (conv.getId().equals(conversationId)) - > > { - > > return true; - > > } + > > return true; > } > } > @@ -210,6 +207,7 @@ public > class > ConversationManager > > { > > > ctx.destroy(); > > } + > > it.remove(); > > } > > } @@ -221,19 +219,16 @@ public > class > ConversationManager */ > public void > destroyAllConversations() { - > > synchronized(conversations) + > > Collection<ConversationContext> collection = > > this.conversations.values(); + > if(collection != > null && collection.size() > 0) > > { - if > (conversations != > null) + > for (ConversationContext > context : collection) > > { - > > Map<Conversation, ConversationContext> > oldConversations = > conversations; - > > conversations = new > ConcurrentHashMap<Conversation, > > ConversationContext>(); - > > - for > > (ConversationContext ctx : oldConversations.values()) - > > { - > > > ctx.destroy(); - > > } - > > conversations.clear(); - > > } + > > context.destroy(); + } > > > } + > + > //Clear conversations + > > conversations.clear(); } > } Modified: > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/el/WebBeansELResolver.java > > > Fri Apr 23 15:32:55 2010 @@ -99,7 +99,7 @@ public class > WebBeansELResolver > extends > > if(!oldContext.equals(context)) > > { > > > store.destroy(); - > > LOCAL_CONTEXT.remove(); + > > > > LOCAL_CONTEXT.set(null); > > } > > else > > { Modified: > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/creation/InjectionTargetProducer.java > > > Fri Apr 23 15:32:55 2010 @@ -88,7 +88,7 @@ public class > > InjectionTargetProducer<T> > > } else > > { - > > > AbstractInjectable.instanceUnderInjection.remove(); + > > > > AbstractInjectable.instanceUnderInjection.set(null); > > } > } > Modified: > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java URL: > > > href=" > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java?rev=937336&r1=937335&r2=937336&view=diff" > > > > target=_blank > > > href="http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java?rev=937336&r1=937335&r2=937336&view=diff" > > target=_blank > >http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java?rev=937336&r1=937335&r2=937336&view=diff ============================================================================== --- > > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java > > > (original) +++ > > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/spi/se/DefaultContextsService.java > > > Fri Apr 23 15:32:55 2010 @@ -211,12 +211,12 @@ public class > > DefaultContextsService exte @Override public > > void destroy(Object destroyObject) { - > > requestContext.remove(); - > > sessionContext.remove(); - > > applicationContext.remove(); - > > conversationContext.remove(); - > > dependentContext.remove(); - > > singletonContext.remove(); + > > requestContext.set(null); + > > sessionContext.set(null); + > > applicationContext.set(null); + > > conversationContext.set(null); + > > dependentContext.set(null); + > > singletonContext.set(null); } > >
