JSF调整

时间:2009-03-10 00:46:45

标签: java jsf websphere performance

遇到JSF填满会话的问题。前几天我们遇到了系统崩溃。发送堆给IBM进行审核,发现我们有一些大到50M的会话。他们在会话中发现了JSF组件,而且有些非常大。

那么,有没有可以完成的调整?配置项看看?或其他方向。

我们的系统是使用JSF和Spring为表示层构建的,后端是EJB,Spring和Hibernate都在WebSphere 6.1上运行。

9 个答案:

答案 0 :(得分:22)

JSF是一项非常有用的技术,但您可以随意使用它。

听起来好像,要么夸大视图状态的大小(通过在组件上设置大值),要么将组件的引用泄漏到其他会话状态(这会很糟糕)。另一个潜在的罪魁祸首是一个过大的视图(我已经看到人们可以轻松构建UI树,从而导致数据表随处可见的非常大的控制图)。我知道IBM提供了丰富的文本和电子表格控件 - 我无法评论这些控件对状态大小的影响。

最简单的方法是检查在 faces-config.xml 中为会话范围配置的托管bean。

JSF在请求之间保存两件事:

  • 视图(页面上的所有控件)
  • 视图状态(控件的状态)

这些是分开的,因为某些控件(例如数据表的子项)可以具有多个状态(每行一个)。状态可以保存到表单上的隐藏字段(如果未加密,可能是一个很大的安全隐患)或会话中。为了容纳共享同一会话的多个浏览器窗口(在某些实现中,支持后退按钮),存储了多个视图。

  • 应该有一个配置选项来设置应用在任何给定时间为会话保留在会话中的视图状态数。
  • 您可以通过提供测量已保存视图/状态大小的StateManager来衡量视图状态的大小(使用带有StateManager的公共构造函数在faces-config.xml中配置StateManager - 请参阅JSF spec PDF以获取更多详细信息;状态是可序列化的,您可以通过将其转储到流来检查其大小。)

大多数IDE构建的JSF应用都有支持bean。通过会话bean作用域可以保持比你想要的更长的状态,这会对会话造成压力。由于每页往往有一个支持bean,所以页面越多,问题就越大。检查 faces-config.xml ,看看这是否是潜在的问题来源。

您可以做的其他事情是在 web.xml 中配置HttpSessionAttributeListener。您可以获得stack trace来帮助确定应用中的问题区域。

答案 1 :(得分:3)

这是我听说过的第二个由于JSF和过多的对象创建而死亡的系统。另一个也在后端使用了Spring和Hibernate。使用OptimizeIt进行性能分析显示所有请求的后端响应都在毫秒级别,但是您可以使用秒表再次使用浏览器进行渲染,因为它需要很长时间 - 30秒到几分钟。客户消耗的内存很荒谬。

我只是一名观察员,而不是该项目团队的成员。我将不得不问这个问题是否得到解决,如果是的话,解决方案可能是什么。

但如果两点成为趋势,我会说JSF可能存在致命缺陷。就个人而言,我完全远离它。

为什么不试试Spring网络前端,看看是否有帮助?如果你遵循Spring惯用法,那么用基于JSTL的JSP和Spring控制器替换JSF应该是一个相对简单的事情。

答案 2 :(得分:3)

我正在研究一个JSF项目,发现我们有一个错误,我们添加了多个JSF h:表单元素。导致每个表单都包含整个视图状态的副本。每页减少1个表格,使页面从~2M减少到~300K。

答案 3 :(得分:1)

您可能遇到了许多支持bean作为会话范围的问题。

您可以尝试查看MyFaces Orchestra。这是一个提供会话范围的库,因此一旦用户完成了一组特定的bean,它们就会从会话中删除。

我知道Spring WebFlow有类似的功能,但我还没有真正研究过它!

答案 4 :(得分:1)

JSF将视图存储在会话中以支持其基于丰富组件的体系结构 (需要保持其视图状态)并且如果使用不当可能会填满堆。如果您没有大量的工作流程,那么每次会话总是会有很少的观看次数。还要尽可能避免在会话中保持后备。使用自定义标记使数据对象仅用于下一个请求周期。我们还可以将Spring Web Flow与JSF一起使用,如果我们在应用程序中有很长的工作流来减少会话中配置的视图的数量,那么它会引入视图范围和流程范围。 JSF可以用于轻松创建丰富的用户界面,这有助于构建类似于桌面应用程序的Web应用程序。将特定堆分配给JSF框架以完成其工作。但是在应用程序端有效地使用内存并确保没有内存泄漏。在开发过程中需要调查和纠正所有内存泄漏。 Aways使用分析器来查找应用程序中存在的内存泄漏和性能瓶颈。

垫。

答案 5 :(得分:1)

如果您使用的是MyFaces< 1.1.6在会话中缓存旧的序列化视图的方式存在巨大的内存泄漏,实际上永远不会让它们释放,以便它们可以被垃圾收集。我遇到了严重的问题,也有50Mb的会话。 MyFaces的快速升级可以毫无问题地解决问题。

答案 6 :(得分:1)

将会话持久性配置为数据库,它将使用最少使用的算法将最少使用的会话推送到内存中。它具有高性能(如果配置正确),将有助于您具体而快速。

答案 7 :(得分:1)

有点古老的话题,但最近遇到了这个问题。通常,存储视图和视图状态(如前所述),并填充会话以允许后退按钮工作。有一些参数可以在需要设置的部署描述符(web.xml)中对此进行排序。

某些库的多个实例可能需要多个参数设置,例如使用MyFaces和JSF RI时。 默认情况下,它们可以设置为一些相当高的值(我相信分别为20和16)。这意味着您可以使用20倍于会话的空间(部分?)。

答案 8 :(得分:1)

生产环境的JSF调整技巧:
  - 图像,CSS和JavaScript资源的使用应由标准HTML标记(img,link,script)而非服务器端完成,并确保在网址前设置#{request.contextPath}以避免相对路径问题。
  - 使用(menu,header,footer)来缓存页面omnifaces cache的静态部分   - 将refresh-period变量设置为-1
  - 将project-stage设置为生产
  - 查看代码过滤器(如果有)

另外,查看我的文章" Java Server Faces in Real-Life Applications"在DZone上,它将为您提供有关JSF在开发,测试和生产环境中的全貌。