我正在研究一个同时拥有大约300个用户的企业web应用程序的性能调优。我从GC日志中注意到,应用程序堆总是在增长,即使在完成GC之后,对象也总是在积累。我已经获得了一个生产堆转储,我很惊讶会话对象占用了堆大小的90%以上!这都是因为AjaxStateHolderObject。
应用程序运行在JSF1.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。
提前感谢您的指导。
任何形式的帮助都会受到感谢,因为我在网上没有发现任何关于这个问题的东西。
发布于 2011-10-04 11:14:31
您似乎遇到了JSF/a4j会话内存泄漏缺陷。有关这一事项的更多说明,见下文链接:
https://issues.jboss.org/browse/RF-3878
它似乎是在会话中缓存视图状态,而不是清理。这是一个带有a4j的bug,无法修复,只是简单地处理。您添加到web.xml中的配置是唯一建议的解决方法,但显然这并没有太大帮助。
a4j似乎不是很可扩展,所以最好的长期解决方案是缓慢地将a4j组件从应用程序中重构出来,然后用不同的组件框架替换它们?对不起,我帮不上忙,祝你好运。
https://stackoverflow.com/questions/7634857
复制相似问题