2011-02-02 161 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。