我正在使用大约300个同时用户进行企业Web应用程序的性能调优。我从GC日志中注意到,即使在Full GC之后,应用程序堆也在不断增长,并且对象总是在累积。我已经获得了生产堆转储,我很惊讶会话对象占据堆大小的90%以上!这都是因为AjaxStateHolderObject。
该应用程序在JSF 1.X和RichFaces 3.3.0上运行。
在开始讨论之前,我尝试了以下内容:
<context-param>
<param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
<param-value>1</param-value>
</context-param>
<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>
以上所有尝试都无法解决内存泄漏问题。
更新
*由于AjaxStateHolder规模庞大,单个用户会话最多可消耗25 MB。
*应用程序的大多数托管bean都是请求范围,会话中没有未使用的引用对象,唯一有关内存的问题是ajaxStateHolder。
提前感谢任何指导。
任何形式的帮助都将受到赞赏,因为我在网上找不到任何与此问题有关的内容。
答案 0 :(得分:0)
您似乎遇到了JSF / a4j会话内存泄漏缺陷。有关此事的更多说明,请参阅以下链接:
https://issues.jboss.org/browse/RF-3878
看起来好像视图状态正在会话中缓存而未清除。它是a4j的一个错误,无法修复,只是解决了。您添加到web.xml
的配置是唯一建议的解决方法,但显然这没有太大帮助。
似乎a4j的可扩展性不是很高,所以也许最好的长期解决方案是慢慢地将a4j组件重构出应用程序并用不同的组件框架替换它们?对不起,我不能帮忙,祝你好运。