IE中gwt应用程序的内存使用情况

时间:2013-06-04 14:56:09

标签: image gwt memory internet-explorer-9

在过去的几天里,我一直试图找出我的gwt应用程序在IE 9上泄漏的原因。 我想和你分享我的一个发现,也许有人可以给我一个关于这里发生什么的线索...... 我写了这个小测试:

public class Memory implements EntryPoint
{
    FlowPanel mainPanel = new FlowPanel();
    FlowPanel buttonsPanel = new FlowPanel();
    FlowPanel contentPanel = new FlowPanel();

    Timer timer;

    Date startDate;

    public void onModuleLoad()
    {
        mainPanel.setWidth("100%");
        mainPanel.setHeight("100%");

        RootPanel.get().add(mainPanel);

        Button startBtn = new Button("start test");
        startBtn.addClickHandler(new ClickHandler(){
            @Override
            public void onClick(ClickEvent event)
            {
                startDate = new Date();
                System.out.println("Started at " + startDate);
                timer = new Timer()
                {
                    public void run()
                    {
                        Date now = new Date();
                        if(isWithin5Minutes(startDate, now))
                        {
                            manageContent();
                        }
                        else
                        {
                            System.out.println("Complete at " + new Date());
                            timer.cancel();
                            contentPanel.clear();
                        }
                    }
                };
                timer.scheduleRepeating(50);
            } 
        });

        buttonsPanel.add(startBtn);

        mainPanel.add(buttonsPanel);
        mainPanel.add(contentPanel);
    }

    private void manageContent()
    {
        if(contentPanel.getWidgetCount() > 0)
        {
            contentPanel.clear();
        }
        else
        {
            for(int i =0; i < 20; i++)
            {
                Image image = new Image();
                image.setUrl("/images/test.png");
                contentPanel.add(image);
            }
        }
    }


    private boolean isWithin5Minutes(Date start, Date now)
    {
        //true if 'now' is within 5 minutes of 'start' date
    }

}

所以,我有这个Timer每50毫秒运行一次(大约5分钟)并执行以下操作: - 如果小组有内容,请将其清除; - 如果面板没有内容,则添加20 png图像(30x30透明度)。

使用sysInternals的Process Explorer我得到了以下结果:

IE 9: enter image description here

Firefox 21.0: enter image description here

我运行了相同的程序并进行了一些更改(.jpg图像而不是.png,只创建一次图像并将它们用作成员变量,使用ClientBundle创建图像)但结果是相同的。另外,我在生产模式下运行应用程序。

我的代码是否有问题可能导致IE中出现此行为? 垃圾收集器(GC)是否应该至少在计时器结束时释放一些使用过的内存? 你们中的任何人以前遇到过这个问题吗?

1 个答案:

答案 0 :(得分:0)

IE中的垃圾收集器是很奇怪的事情。例如。您可以通过简单地最小化浏览器窗口来强制它运行。我想你的情况下泄漏是清除容器时浏览器无法正确删除的图像。尝试使用JS“删除”操作删除它们,如:

private native void utilizeElement(Element element) /*-{
  delete element;
}-*/;

然后稍微更改您的manageContent:

    if(contentPanel.getWidgetCount() > 0)
    {
        for (Iterator<Widget> it = contentPanel.iterator(); it.hasNext();)
            utilizeElement(it.next().getElement());
        contentPanel.clear();
    }

希望这有帮助。