htmlunit 2.16を使用していくつかのWebサイトをスクラップしようとしています。ウェブサイトのコンテンツは少し重く、5000ページ前後のページがあります。一部のページが破棄された後、Javaヒープスペースの問題が発生しています。私は-Xms1500mと-Xmx3000mを割り当てました。しかし、30分45秒を実行した後は、javaをメモリから解放します。java.lang.OutOfMemoryError:Htmlunitを使用したJavaヒープスペースの使用
try (WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38)) {
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getCookieManager().setCookiesEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);
webClient.setCssErrorHandler(new SilentCssErrorHandler());
webClient.getOptions().setAjaxController(new NicelyResynchronizingAjaxController());
// Get 1st page Data
HtmlPage currentPage = webClient.getPage("www.example.com");
for (int i = 0; i < 5000; i++) {
try {
HtmlElement next = (HtmlElement) currentPage
.getByXPath("//span[contains(text(),'Next')]")
.get(0);
currentPage = next.click();
webClient.waitForBackgroundJavascript(10000);
System.out.println("Got data: " + currentPage.asXml());
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
私たちは、私がコンテンツを取得するには、[次へ]ボタンをクリックして見ることができるように:ここに私の例です。私はwebClient.close()
も持っています。誰も似たような問題に直面することはできますか? htmlunitにはメモリリークがありますか?
@SeanBrightご入力いただきありがとうございました:) – Sthita
@SeanBright編集をおねがいしますが、最後に{webClient.close();}を追加する必要があります。これは本当に重要です。 – Sthita
これは自動的に[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) –