2011-02-02 160 views
2

内存将增加每个循环周期。任何想法为什么是这样?htmlunit内存泄漏

public static void main(String p[]) throws IOException { 

     WebClient webClient = new WebClient(); 

     for (int a = 0; a < 100000; a++) { 
      HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net"); 
      String pageAsXml = page.asXml(); 
      System.out.println(pageAsXml); 
     } 

    } 

由于提前

回答

1

JVM是不是热衷于尽快释放数据。 如果你给虚拟机分配240MB的空间,那么在你看到垃圾收集器为了钱而做的事情之前,它会接近这个值。 继续此测试,直到遇到OutofMemoryError。 如果是这样,那么可能是是HtmlUnit库中的泄漏。

1

每次调用webClient.getPage时,htmlunit都会为该页面创建一个新窗口。它类似于网页浏览器中的标签。

2

你需要调用

webClient.closeAllWindows() 

在循环您正在使用页面完成后。

PS显然上面的方法在新版本的HtmlUtit中被弃用,而应该使用 webClient.close()来代替。

+0

看看@Daarin的答案!此方法现在已被弃用,应该在版本2.16及更高版本中更改为webClient.close() – Kerooker 2018-01-21 05:11:38

0

尝试

protected void closeWebClient(WebClient wc) { 
    List<WebWindow> windows = wc.getWebWindows(); 
    for (WebWindow wd : windows) { 
     // wd.getThreadManager().interruptAll(); 
     wd.getJobManager().removeAllJobs(); 
    } 
    wc.closeAllWindows(); 
} 

它可以帮助你。

1

从版本2.16开始,不再推荐使用closeAllWindows(),因为它被删除。 所以现在你可以调用

webClient.close(); 

关闭客户端,并停止的JavaScript excecution。