遇到 JSF 正在填满我们的会话的问题。前几天我们发生了系统崩溃。将 Heap 发送给 IBM 进行审核,发现我们有一些会话高达 50M。他们在会话中发现 JSF 组件并且有些非常大。
那么,有没有可以做的调优呢?配置项要看?或者其他方向。
我们的系统是使用 JSF 和 Spring 作为表示层构建的,后端是 EJB、Spring 和 Hibernate,它们都在 WebSphere 6.1 上运行。
遇到 JSF 正在填满我们的会话的问题。前几天我们发生了系统崩溃。将 Heap 发送给 IBM 进行审核,发现我们有一些会话高达 50M。他们在会话中发现 JSF 组件并且有些非常大。
那么,有没有可以做的调优呢?配置项要看?或者其他方向。
我们的系统是使用 JSF 和 Spring 作为表示层构建的,后端是 EJB、Spring 和 Hibernate,它们都在 WebSphere 6.1 上运行。
JSF 是一种有用的技术,但您当然可以用它来吊死自己。
听起来,要么你在夸大视图状态的大小(通过在组件上设置大的值),要么你正在将对组件的引用泄漏到其他会话状态中(这会很糟糕)。另一个潜在的罪魁祸首是视图过大(我已经看到人们可以轻松构建 UI 树导致非常大的控制图,其中到处都是数据表)。我知道 IBM 提供富文本和电子表格控件 - 我无法评论使用这些控件将对状态大小产生什么影响。
唾手可得的成果是检查faces-config.xml中为会话范围配置的托管 bean 。
JSF 在请求之间保存了两件事:
这些是分开的,因为某些控件(例如数据表的子项)可以具有多种状态(每行一个状态)。状态可以保存到表单上的隐藏字段(如果未加密,可能会带来很大的安全隐患)或会话中。为了适应共享同一会话的多个浏览器窗口(并且在某些实现中,支持后退按钮),存储了多个视图。
大多数 IDE 构建的 JSF 应用程序都有支持 bean。有可能通过会话 bean 范围保持状态比您想要的时间更长,从而给会话带来压力。由于每页往往有一个支持 bean,因此您拥有的页面越多,问题就越大。检查您的faces-config.xml以查看这是否是潜在的问题来源。
您可以做的其他事情是在您的web.xml中配置一个HttpSessionAttributeListener。您可以获得堆栈跟踪以帮助识别应用程序中的问题区域。
这是我听说的第二个由于 JSF 和过多的对象创建而死亡的系统。另一个在后端也使用了 Spring 和 Hibernate。使用 OptimizeIt 进行分析表明,所有请求的后端响应都在毫秒级,但是您可以使用秒表再次为浏览器渲染计时,因为它花了很长时间 - 30 秒到几分钟。客户端消耗的内存是荒谬的。
我只是一个观察者,不是那个项目团队的成员。我将不得不询问问题是否已解决,如果是,解决方案可能是什么。
但是,如果有两点形成趋势,我会说 JSF 可能存在致命缺陷。就个人而言,我完全远离它。
为什么不试试 Spring Web 前端看看是否有帮助?如果您遵循 Spring 习惯用法,那么将 JSF 替换为基于 JSTL 的 JSP 和 Spring 控制器应该是一件相对简单的事情。
我正在处理一个 JSF 项目,发现我们有一个错误,我们正在添加多个 JSF h:form 元素。导致每个表单都包含整个视图状态的副本。将每页减少到 1 个表单将页面从 ~2M 减少到 ~300K。
您可能会遇到将大量支持 bean 作为会话范围的问题。
您可以尝试查看MyFaces Orchestra。这是一个提供会话范围的库,因此一旦用户完成了一组特定的 bean,他们将从会话中删除。
我知道 Spring WebFlow 具有类似的功能,但我还没有真正研究过!
JSF 将视图存储在会话中以支持其丰富的基于组件的架构(需要维护其视图状态),如果使用不当,可能会填满堆。如果您没有大的工作流程,请始终使用每个会话的少量视图。还要尽可能避免让 backingbeans 保持在会话中。使用自定义标签使数据对象仅用于下一个请求周期。我们还可以将 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)
而不是服务器端来完成,并且一定要#{request.contextPath}
在 url 之前设置以避免相对路径问题。-使用
缓存页面的静态部分
- 将变量设置为 -1
- 设置为生产
- 检查您的代码过滤器(如果有) (menu,header,footer)
omnifaces cache
refresh-period
project-stage
另外,请查看我在 DZone 上的文章“ Java Server Faces in Real-Life Applications ”,它将让您全面了解 JSF 在开发、测试和生产环境中的情况。