[
https://issues.apache.org/jira/browse/COCOON-2259?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Thorsten Scherler reopened COCOON-2259:
---------------------------------------
We are researching a memoryLeak in a client application and found that this
patch is not enough. As reported by miguel valencia and Mercedes Duarte
Madiedo the use of
this.componentHolder.set(null);
leads to a memory leak.
Our research lead us to
http://dspace.2283337.n4.nabble.com/ThreadLocals-and-OutOfMemory-td4642935.html
http://www.0xcafefeed.com/2004/06/of-non-static-threadlocals-and-memory/
Since cocoon2.2 is 1.5 compatible using the remove() method is getting rid of
the memory leak.
> Memory leak in PoolableProxyHandler
> -----------------------------------
>
> Key: COCOON-2259
> URL: https://issues.apache.org/jira/browse/COCOON-2259
> Project: Cocoon
> Issue Type: Bug
> Components: * Cocoon Core
> Affects Versions: 2.2, 2.2-dev (Current SVN)
> Reporter: Alexander Daniel
> Assignee: Thorsten Scherler
> Fix For: 2.2-dev (Current SVN)
>
> Attachments: patchForIssue2259.txt
>
>
> I reproduced the problem with following pipeline and by adding log output to
> PoolableProxyHandler [1]
> <map:pipeline id="cocoonTest" type="noncaching">
> <map:match pattern="cocoonProtocol">
> <map:generate src="cocoon://sub"/>
> <map:serialize type="xhtml"/>
> </map:match>
> <map:match pattern="sub">
> <map:generate src="welcome/welcome.xml"/>
> <map:transform src="welcome/welcome.xslt"/>
> <map:serialize type="xhtml"/>
> </map:match>
> </map:pipeline>
> Changing the line
> this.attributeName = PoolableProxyHandler.class.getName() + '/' +
> this.handler.hashCode();
> to
> this.attributeName = PoolableProxyHandler.class.getName() + '/' +
> this.hashCode();
> fixes the memory leak.
> Why? The PoolableFactoryBean [2] handler is a singleton for every pipeline
> component, i.e. one instance for noncaching pipeline, one instance for xalan
> transformer, ... Therefore the attributeName is the same for every component
> of the same type but Spring requires an unique value for the destruction
> callback handler.
> In the example sitemap above two noncaching pipeline instances are needed for
> processing the request. Both call registerDestructionCallback with the same
> attributeName. Because the attributeName is the same the callback is only
> called once and the other component remains in ThreadLocal.
> [1]
> http://svn.apache.org/repos/asf/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/PoolableProxyHandler.java
> [2]
> http://svn.apache.org/repos/asf/cocoon/trunk/core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/core/container/spring/avalon/PoolableFactoryBean.java
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira