Tapestry4.0.x版本的PagePool实现很简单,只是使用一个map容器作为缓存,高并发的情况下容易导致OutOfMemoryException,下面是邮件列表中的相关内容,里边也提到了相关建议,估计会作为一个bug修改,在未修改之前,我会给出一个简单实现。
PagePool doesnt remove idle pages, heap memory doens't get reallocated
> ----------------------------------------------------------------------
>
> Key: TAPESTRY-1151
> URL: http://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
> Assigned To: Jesse Kuhnert
> Priority: Minor
>
> 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.
java类实现代码:
java 代码
- public class SoftReferenceObjectPool implements ObjectPool, ResetEventListener,
- ReportStatusListener {
- private String _serviceId;
-
- private int _count = 0;
-
- private Map _pool = new HashMap();
-
- 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);
-
- 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++;
- }
-
- public synchronized void resetEventDidOccur() {
- _pool.clear();
-
- _count = 0;
- }
-
- public synchronized void reportStatus(ReportStatusEvent event) {
- event.title(_serviceId);
-
- event.property("total count", _count);
-
- event.section("Count by Key");
-
- Iterator i = _pool.entrySet().iterator();
-
- while (i.hasNext()) {
- Map.Entry entry = (Map.Entry) i.next();
-
- String key = entry.getKey().toString();
-
- List pooled = (List) entry.getValue();
-
- event.property(key, pooled.size());
- }
- }
-
- public void setServiceId(String serviceId) {
- _serviceId = serviceId;
- }
-
- }
查找了一下hivemind中用到ObjectPool的地方,共有三处,分别替换之。
xml 代码
- <implementation service-id="tapestry.page.PagePool">
- <invoke-factory>
- <construct class="org.edynasty.tapestry.pool.SoftReferenceObjectPool">
- <event-listener service-id="tapestry.ResetEventHub"/>
- <event-listener service-id="tapestry.describe.ReportStatusHub"/>
- </construct>
- </invoke-factory>
- </implementation>
-
- <implementation service-id="tapestry.GlobalObjectPool">
- <invoke-factory>
- <construct class="org.edynasty.tapestry.pool.SoftReferenceObjectPool">
- <event-listener service-id="tapestry.ResetEventHub"/>
- <event-listener service-id="tapestry.describe.ReportStatusHub"/>
- </construct>
- </invoke-factory>
- </implementation>
-
- <implementation service-id="tapestry.request.EnginePool">
- <invoke-factory>
- <construct class="org.edynasty.tapestry.pool.SoftReferenceObjectPool">
- <event-listener service-id="tapestry.ResetEventHub"/>
- <event-listener service-id="tapestry.describe.ReportStatusHub"/>
- </construct>
- </invoke-factory>
- </implementation>
分享到:
相关推荐
创建组件类并定义其属性和行为,然后在模板文件中使用它们。 4) **定义页面**:页面是Tapestry4中的主要交互单元,它由一个或多个组件组成。在Java类中定义页面,然后在HTML模板中引用这些组件。 5) **配置URL映射...
在Tapestry 4中,表单处理变得简单而强大,书中的相关章节会讲解如何创建表单、验证输入、处理表单提交,以及使用Tapestry的服务器端和客户端验证机制。 另外,本书还会涉及国际化和本地化支持,帮助读者实现多语言...
"Tapestry4 Users Guide" 和 "Tapestry4 Quick Start" 这两份文档,分别提供了全面的用户指南和快速入门教程,帮助开发者了解和掌握Tapestry 4的使用方法和最佳实践。 10. **社区支持**: 作为Apache项目的一部分...
虽然Tapestry 4的中文文档较少,但提供的《Tapestry4 用户指南》和《Tapestry4 快速启动》是宝贵的参考资料。它们将帮助初学者理解Tapestry的基本概念、组件使用、事件处理等方面的知识。 总的来说,Tapestry 4是...
在"深入浅出Tapestry4"这本书中,作者会详细讲解如何创建和配置组件,如何使用服务容器管理应用的依赖,以及如何利用Tapestry4的模板语言和事件机制来构建动态的Web应用。读者还可以从书中了解到错误处理、国际化和...
通过阅读《Tapestry4开发指南》这份文档,开发者可以掌握如何创建Tapestry应用,如何设计和实现组件,以及如何调试和优化应用性能。这份指南对于任何希望使用Tapestry 4开发高效、可维护的Web应用的Java开发者来说,...
在源代码中,"IceRoom"可能是一个示例项目,它展示了如何使用Tapestry4创建动态Web页面。IceRoom项目可能包含了各种组件、服务、页面和模板文件,这些文件共同构成了一个功能完整的Web应用。通过调试这个项目,你...
Tapestry4 Users Guide(2)则更深入地探讨了Tapestry的高级特性和最佳实践,可能包含: 1. **国际化与本地化**:讲解如何实现多语言支持,包括资源键和资源文件的管理。 2. **服务组件**:介绍Tapestry的服务组件...
通过这些资料的学习,开发者不仅能掌握Tapestry的基础知识,还能深入理解其高级特性,从而在实际项目中更加灵活地运用Tapestry框架,提高开发效率和代码质量。对于想要在Java Web开发领域专精Tapestry的程序员来说,...
在这个"tapestry4+spring+hibernate整合实例"中,我们将探讨如何将这三个框架协同工作,以实现用户数据的增删改查功能。这通常涉及到以下几个步骤: 1. **环境配置**:首先,我们需要确保正确安装了JDK、Tomcat...
在“水果商店”例子中,我们将深入探讨Tapestry4如何实现一个简单的电子商务应用。 1. **Tapestry4基础概念** - **组件**: Tapestry4的核心是组件,它们是构建用户界面的基本单元,可以是按钮、表格、表单等。每个...
在这个名为"MyTapestry4-quickStart.rar"的压缩包中,包含的是一个Tapestry4的快速入门项目,帮助开发者快速了解并开始使用这个框架。 在描述中提到,这个项目是基于JDK1.5开发的,这意味着我们需要Java 1.5或更高...
在Tapestry 5 中,开发者可以通过创建CRUD(创建、读取、更新、删除)功能的应用来了解框架的核心概念。这包括页面导航、依赖注入和资源注入、用户输入验证以及状态管理。Tapestry 还内置了Ajax支持,使得创建Ajax...
Tapestry5最新中文教程.doc 作者 Renat Zubairov & Igor Drobiazko译者 沙晓兰 发布于 2008年7月2日 下午9时30分 社区 Java 主题 Web框架 ----------------------------------------- Tapestry5.1实例教程.pdf ...
9. **生命周期管理**:Tapestry4管理组件的生命周期,包括初始化、销毁以及在页面请求中的创建和复用。这使得资源管理更加高效。 10. **集成性**:Tapestry4可以与其他Java库和框架(如Hibernate进行数据持久化)...