参考老外两篇文章:
https://maxrohde.com/2013/01/05/fix-htmlunit-memory-leak/
http://stackoverflow.com/questions/26450896/htmlunit-close-all-windows-memory-leak
解决核心:
webClient.getCurrentWindow().getJobManager().removeAllJobs();
webClient.close();
System.gc();
内存较为稳定代码:
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class Test {
public static void main(String args[]) throws FailingHttpStatusCodeException, MalformedURLException, IOException{
WebClient webClient = initializeClient();
for(int i = 0; i < 5000; i++){
try{
webClient = initializeClient();
System.out.println(webClient);
HtmlPage page = webClient.getPage("http://www.baidu.com");
System.out.println(page.asText());
}finally {
webClient.getCurrentWindow().getJobManager().removeAllJobs();
webClient.close();
System.gc();
}
}
}
private static WebClient initializeClient() {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
return webClient;
}
}
内存不断增加的代码:
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class Test2 {
public static WebClient webClient;
static {
webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
}
public static void main(String args[]) throws FailingHttpStatusCodeException, MalformedURLException, IOException{
for(int i = 0; i < 5000; i++){
System.out.println(webClient);
HtmlPage page = webClient.getPage("http://blog.csdn.net/qq43599939");
System.out.println(page.asText());
}
}
}