12

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

那么,有没有可以做的调优呢?配置项要看?或者其他方向。

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

4

9 回答 9

22

JSF 是一种有用的技术,但您当然可以用它来吊死自己。

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

唾手可得的成果是检查faces-config.xml中为会话范围配置的托管 bean 。

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

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

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

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

大多数 IDE 构建的 JSF 应用程序都有支持 bean。有可能通过会话 bean 范围保持状态比您想要的时间更长,从而给会话带来压力。由于每页往往有一个支持 bean,因此您拥有的页面越多,问题就越大。检查您的faces-config.xml以查看这是否是潜在的问题来源。

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

于 2009-03-10T12:18:58.383 回答
3

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

我只是一个观察者,不是那个项目团队的成员。我将不得不询问问题是否已解决,如果是,解决方案可能是什么。

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

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

于 2009-03-10T00:56:28.740 回答
3

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

于 2009-03-11T06:25:23.747 回答
1

您可能会遇到将大量支持 bean 作为会话范围的问题。

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

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

于 2009-03-11T15:44:28.927 回答
1

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

垫。

于 2009-04-09T02:22:02.510 回答
1

如果您使用的是 MyFaces < 1.1.6,那么它在会话中缓存旧的序列化视图的方式存在巨大的内存泄漏,有效地从不让它们释放,以便它们可以被垃圾收集。我对此有一个严重的问题,并且也有 50Mb 的会话。MyFaces 的快速升级解决了这个问题,没有任何问题。

于 2009-05-27T12:07:07.167 回答
1

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

于 2009-07-18T22:01:52.897 回答
1

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

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

于 2011-03-11T11:47:29.747 回答
1

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

另外,请查看我在 DZone 上的文章“ Java Server Faces in Real-Life Applications ”,它将让您全面了解 JSF 在开发、测试和生产环境中的情况。

于 2016-06-07T01:49:55.647 回答