在过去的几天里,我一直试图找出我的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:
Firefox 21.0:
我运行了相同的程序并进行了一些更改(.jpg图像而不是.png,只创建一次图像并将它们用作成员变量,使用ClientBundle创建图像)但结果是相同的。另外,我在生产模式下运行应用程序。
我的代码是否有问题可能导致IE中出现此行为? 垃圾收集器(GC)是否应该至少在计时器结束时释放一些使用过的内存? 你们中的任何人以前遇到过这个问题吗?
答案 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();
}
希望这有帮助。