2016-10-27 3 views
3

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にはメモリリークがありますか?

+0

@SeanBrightご入力いただきありがとうございました:) – Sthita

+0

@SeanBright編集をおねがいしますが、最後に{webClient.close();}を追加する必要があります。これは本当に重要です。 – Sthita

+2

これは自動的に[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) –

答えて

0

多分問題は、すべてのページがまだ履歴に保存されていることです。

私は閲覧履歴をこのように無効にします。

try { 
     final History window = webClient.getWebWindows().get(0).getHistory(); 
     final Field f = window.getClass().getDeclaredField("ignoreNewPages_"); //NoSuchFieldException 
     f.setAccessible(true); 
     ((ThreadLocal<Boolean>) f.get(window)).set(Boolean.TRUE); 
     LOGGER.debug("_dbff772d4d_ disabled history of Webclient"); 
    } 
    catch (final Exception e) { 
     LOGGER.warn("_66461112f7_ Can't disable history of Webclient"); 
    } 

私はこれらの設定は、あなたの問題に関連していないですが、どこに有用私のプロジェクトで how-to-limit-htmlunits-history-size


からアイデアを得た:

webClient.setJavaScriptTimeout(JAVASCRIPT_TIMOUT); 
    webClient.getOptions().setTimeout(WEB_TIMEOUT); 
    webClient.getOptions().setCssEnabled(false); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setPopupBlockerEnabled(true); 
    webClient.setRefreshHandler(new WaitingRefreshHandler(REFRESH_HANDLER_WAIT_LIMIT)); 
1

最新バージョンのHtm lUnit。私たちは多くのメモリ問題を解決しました。少なくとも2.23は歴史に関するいくつかの修正があります。 さらに、履歴サイズを制御できるようになりました。

関連する問題