[
https://issues.apache.org/jira/browse/TAPESTRY-1151?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jesse Kuhnert resolved TAPESTRY-1151.
-------------------------------------
Resolution: Fixed
Done.
> PagePool doesnt remove idle pages, heap memory doens't get reallocated
> ----------------------------------------------------------------------
>
> Key: TAPESTRY-1151
> URL: https://issues.apache.org/jira/browse/TAPESTRY-1151
> Project: Tapestry
> Issue Type: Bug
> Components: Framework
> Affects Versions: 4.0
> Environment: java 1.4, apache tomcat 5.0 IBM websphere 5.0
> Reporter: lionel gomez
> Assignee: Jesse Kuhnert
> Priority: Minor
> Fix For: 4.1.2
>
>
> This may not qualify as a bug since its so easy to provide override using
> hivemind, but instead an improvement for future releases. Also provided an
> optional page pool implementation.
> Tapestry 4.0 PagePool implementation doesnt remove idle pages. When having
> hundred of pages with a lot of components and high user concurrency, tapestry
> generates many instances of each page. These instances are pooled and never
> unreferenced and never garbage collected. Our 1GB heap eventually fills up
> and reduces the memory available to other parts of the application.
> Eventually causes OutOfMemoryException.
> We ensured caching is enabled and config change made to use unique locale,
> but still, heap eventually fills up.
> With Hivemind its very easy to override the pagePool and provide different
> implementation. A page pool that uses softReferences is a good option.
> Acording to java api:
> All soft references to softly-reachable objects are guaranteed to have been
> cleared before the virtual machine throws an OutOfMemoryError.
> This prevents OEM due to heap filling up.
> New SoftPagePool only changes a couple of lines to use soft references.
> public synchronized Object get(Object key)
> {
> List pooled = (List) _pool.get(key);
> if (pooled == null || pooled.isEmpty())
> return null;
> _count--;
> SoftReference reference = (SoftReference) pooled.remove(0);
> //returns null if has been cleared by GC same as pool where empty
> return reference.get();
> }
> public synchronized void store(Object key, Object value)
> {
> List pooled = (List) _pool.get(key);
> if (pooled == null)
> {
> pooled = new LinkedList();
> _pool.put(key, pooled);
> }
> SoftReference reference = new SoftReference(value);
> pooled.add(reference);
> _count++;
> }
> Additionally the page pool implementation can use a clean idle pages
> mechanism using same design as Tapestry 3.0 ThreadJanitor or setting a
> timestamp when storing pages and a TimerTask and Timer wich receives events
> on registry shutdown. All this by using hivemind overriding features.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]