【发布时间】:2011-10-03 12:15:52
【问题描述】:
我正在对一个同时拥有大约 300 个用户的企业 Web 应用程序进行性能调整。我从 GC 日志中注意到,应用程序堆总是在增长,并且即使在 Full GC 之后对象也总是在累积。我已经获得了一个生产堆转储,我很惊讶会话对象占据了堆大小的 90% 以上!这都是因为 AjaxStateHolderObject。
应用程序在 JSF 1.X 和 RichFaces 3.3.0 上运行。
在开始讨论之前,我尝试了以下方法:
- 将以下代码添加到 web.xml
<context-param>
<param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
<param-value>1</param-value>
</context-param>
- 将以下代码添加到 web.xml
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>1</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>1</param-value>
</context-param>
- 从 RichFaces 3.3.0 升级到 3.3.3
以上所有尝试都未能解决内存泄漏问题。
更新
*由于 AjaxStateHolder 的巨大大小,单个用户会话最多可消耗 25 MB。
*应用程序的大部分托管bean都是请求范围,会话中没有未使用的引用对象,唯一与内存有关的问题是ajaxStateHolder。
提前感谢您的任何指导。
任何形式的帮助都将不胜感激,因为我在网上没有找到任何有关此问题的信息。
【问题讨论】:
-
您确实没有提供足够的细节让我们帮助您。会话可能很大,但这可能是因为您的应用程序服务器正在为 3k 并发用户提供服务,这很多。单个用户会话通常消耗多少内存?对象是否存储在实际上可以是无状态的会话中?您可以利用某些托管 bean 的视图范围来将有状态范围限制为单个页面吗?它们的未使用对象是否在不再被读取或使用的会话管理 bean 中被引用?简单的配置调整在这里可能没有什么不同。
-
@maple_shaft 抱歉,这只是一个错字,我的意思是只有 300 个用户。 :) 单个用户会话最多可消耗 25 MB。大多数托管 bean 都是请求范围。会话中没有未使用的引用对象,唯一与内存有关的问题是 ajaxStateHolder。
标签: java performance jsf memory-leaks ajax4jsf