gpt4 book ai didi

ajax - uicomponent 树内存使用情况

转载 作者:行者123 更新时间:2023-12-04 06:36:13 25 4
gpt4 key购买 nike

问候,

我有丰富的面孔应用程序(3.3.2.SR1)。该应用程序使用 ModelPanel 来查看实体。在我想显示它们之前,所有模式面板都不会渲染(渲染 = false)。应用程序变得大,并且从一个面板到其他使用许多关系。一切正常,但如果组件渲染为真或假,richfaces 似乎会在所有可能的情况下在内存中创建 UIComponent 树。当我尝试检查应用程序的内存使用情况时(我使用 YourKit Java Profiler 来满足这些需求),我发现它在一个 session 中使用了大量内存。

我将 Facelets 与 Richfaces 一起使用,我尝试使用

<c:if test="rendred condition"... /> content </c:if>

它开始使用显着减少的内存,但是......
当我用面板重新渲染区域时,父屏幕上的控件停止工作。我怀疑这是因为每次更改组件树时都会重新创建整个树,并且我有不同步的客户端(html)和服务器(面孔)部分。

有人可以建议我如何减少内存使用吗?我有真正的问题,因为 HeapMemory 中的 StandardSession 对象使用 60-150Mb。几乎所有这些内存都用于 UIControls。

问题示例:

我有引用 panel1、panel2、panel3 的页面。

面板是:
<rich:modalPanel >
<a4j:outputPanel layout="block"
rendered="#{PanelBeanHolder.renderedViewScreen}">
<ui:insert name="panelContent" />
</a4j:outputPanel>
</rich:modalPanel>

我仅在执行此操作时才呈现面板。并且在我需要之前不想加载输出面板的 UI 控件。

先感谢您。

附言我尝试执行以下操作来改善这种情况

配置 session 中的观看次数 在 web.xml 里面有:
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>4</param-value>
</context-param>

<context-param>
<param-name>com.sun.faces.numberOfLogicalViews</param-name>
<param-value>4</param-value>
</context-param>

它必须改进 StateHolder 对象,但并没有太大帮助。当这些数字增长时,我进行了测量并且内存使用量也在增长。但是,当我厌倦将它们设置为 1,1 - 一些页面停止工作。有时请求被转发到欢迎页面。 2,2 改善了这种情况,但转发到欢迎页面的问题仍然存在。

试过 在 javax.faces.STATE_SAVING_METHOD 中使用客户端模式.它仍然为 UIComponent 模型使用大量内存。即使对象被序列化并且必须存储在表单中。

试过 重写 stateManager
在 faces.config 中:
<state-manager>org.ajax4jsf.application.CompressAjaxStateManager</state-manager>

并重写 buildViewState 和 restoreView 以压缩流。
它没有多大帮助。

最佳答案

JSF 使用在请求之间维护的有状态组件树。默认情况下,这通常在 session 中维护。您可以使用一些功能来控制它。

配置状态保存参数

通常有特定于实现的参数来控制存储在 session 中的 View 数量 - 取决于您的应用程序的行为方式,这可能很容易获胜。

您可以使用 javax.faces.STATE_SAVING_METHOD 将状态保存在表单中。范围。但是,请注意您在每个请求中发送更多信息,并且允许客户端指示服务器端状态存在安全风险(确保您对您的实现如何加密此数据感到满意)。您将需要检查与您的组件库(即 RichFaces)的兼容性,尤其是在您使用 AJAX 时。

JSF 2 使用一种新的状态保存机制来减少 session 开销;您的 faces-config.xml将需要更新到 2.0 版本。我相信这个想法来自 Apache Trinidad ,因此您可以从那里提取 JSF 2 之前的版本。

进行自己的状态保存和/或 View 创建

实现你自己的 StateManager 和/或 ViewHandler 让您以编程方式控制 View 的处理方式。例如,你可以写一个 StateManager将 View 持久化到数据库(具有适当的超时和清理)。

使用组件绑定(bind)和 transient 控件

您可以对组件的创建方式进行编程控制。从绑定(bind)规范:

  • When a component instance is first created (typically by virtue of being referenced by a UIComponentELTag in a JSP page), the JSF implementation will retrieve the ValueExpression for the name binding, and call getValue() on it. If this call returns a non-null UIComponent value (because the JavaBean programmatically instantiated and configured a component already), that instance will be added to the component tree that is being created. If the call returns null, a new component instance will be created, added to the component tree, and setValue() will be called on the ValueExpression (which will cause the property on the JavaBean to be set to the newly created component instance).
  • When a component tree is recreated during the Restore View phase of the request processing lifecycle, for each component that has a ValueExpression associated with the name “binding”, setValue() will be called on it, passing the recreated component instance.


您可能可以将它与 transient 一起使用子组件的属性以编程方式控制子组件的创建/销毁。这是手动的,有点困惑,但在极端情况下可能会起作用。

我确信这不是一份详尽的 list 。

关于ajax - uicomponent 树内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4843465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com