【问题标题】:JSF TuningJSF 调优
【发布时间】:2010-10-12 07:55:15
【问题描述】:

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

那么,有什么可以做的调整吗?配置项要看?或其他方向。

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

【问题讨论】:

    标签: java jsf websphere performance


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 只是个人意见,但我认为缺陷在于 IBM 及其 JSF 实现。我无法证明我的感受:)
      • 我看到失败的那个使用了 Sun JVM 和 Apache JSF 实现。 Apache 很大程度上是 IBM,所以我不能说这两者有什么不同。我认为这是 JSF 模型 - 我觉得它很重。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          垫子。

          【讨论】:

            【解决方案6】:

            如果您使用的是 MyFaces

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                  【解决方案9】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 2010-10-27
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-01-16
                    • 1970-01-01
                    • 2012-03-01
                    相关资源
                    最近更新 更多