JSF调整

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

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

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

JSF是一项非常有用的技术,但您肯定可以自己使用它。

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

悬而未决的成果是检查faces-config.xml中为会话范围配置的托管bean。

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

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

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

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

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

您可以做的其他事情是在web.xml中配置HttpSessionAttributeListener 。 您可以获得堆栈跟踪以帮助识别应用中的问题区域。

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

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

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

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

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

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

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

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

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

垫。

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

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

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

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

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

另外,在DZone上查看我的文章“ 真实应用程序中的Java Server Faces ”,它将为您提供有关JSF在开发,测试和生产环境中的全貌。