2016-10-27 4 views
3

Я пытаюсь отменить некоторые сайты, используя htmlunit 2.16. Содержимое веб-сайтов немного тяжелое и имеет страницы около 5000. Я получаю проблему с кучей Java после того, как какая-то страница будет утилизирована. Я выделил -Xms1500m и -Xmx3000m. Но после 30/45 минут он выкидывает java из памяти. Вот мой пример:java.lang.OutOfMemoryError: Java куча пространства с использованием Htmlunit

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 Извините, о typo :) – 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 есть некоторые исправления в отношении истории. Кроме того, теперь вы можете управлять размером истории.

Смежные вопросы