Primefaces JSF多次打开一个对话框会增加浏览器内存

时间:2014-08-22 21:45:38

标签: java javascript jsf primefaces memory-leaks

我正在使用Primefaces 4.0,JSF 2.1.11

我有一个带有按钮的页面,该按钮调用了一个prime-faces dialog.show(),并在填写完成后点击完成后会出现一个对话框,它会刷新页面,并将新项目添加到prime-faces dataTable中。每次我点击按钮打开对话框并填写它然后点击完成我的浏览器内存上升。在自动化测试中,一旦对话框打开125次(我们的用户可以连续执行多达800次),浏览器就会耗尽内存。在IE8中,125项内存使用量为880 MB。

所以我的问题是如何防止这种情况?

更多信息:使用Glassfish 3进行视图编辑,这个问题在所有浏览器中都会出现,但在旧浏览器中会更糟。

我采取的步骤: 1.我每次都在对话框上做一个.show()。hide()。 2.我试图调用javascript来清空DOM中的div而没有任何成功。

我已经查看了primefaces问题,我没有看到任何内存泄漏报告,如果我让页面打开,内存不会上升,它只在我使用页面并打开和关闭对话框时。 / p>

更新:

这是一些代码

此表单不在另一种表单中

  <h:form id="lineItemForm">
        <p:dialog id="addLineItemDialogId" widgetVar="lineItemDialog" header="Line item" width="900" resizable="false"
          modal="true" showEffect="fade">

... 
...


             <p:commandLink value="Done"
                            onclick="actionStarted($(this))"
                            action="#{lineItemView.save}"
                            update=":wizardForm:lineItemWizardPanel"
                            oncomplete="actionComplete(); saveLineItem(args);"/>

    </h:form>

saveLineItem(args)是一个javascript方法,在验证检查后调用.hide()

这是对.show()的调用,它的形式为wizardForm。

    <h:form id="wizardForm"/>
...
...
          <p:commandLink value="Add Item"
                        action="#{lineItemView.loadLineItemFromRequest(requisitionView.request)}"
                        process="@this"
                        update=":lineItemForm"
                        oncomplete="lineItemDialog.show()"/>

更新所以它最终成了红色。我删除了后端方法调用,内存泄漏消失了。看起来像是使用ajax导致问题的dataTable。查看它并在Primefaces 5中修复 http://www.beyondjava.net/blog/primefaces-5/

1 个答案:

答案 0 :(得分:0)

虽然我不确定,但我会猜一猜。尝试构建像这样的代码:

<h:body>
    <h:form id="mainForm">
        ...
        ...
        ...
        ...
    </h:form>

    <p:dialog>
        <h:form id="dialogForm">
            ...
        </h:form>
    </p:dialog>
</h:body>

在用于显示对话框的按钮上使用update="dialogForm"

我相信如果您update对话框本身或其父对象之一,它可能会导致几个对话框相互隐藏。这可能解释了内存使用情况。此外,最佳做法是将对话框放在主窗体之外。