java.lang.OutOfMemoryError:使用Htmlunit的Java堆空间

时间:2016-10-27 14:19:53

标签: java htmlunit

我试图使用htmlunit 2.16废弃一些网站。网站内容有点沉重,页面大约为5000.我在一些页面被废弃后出现了Java堆空间问题。我已经分配了-Xms1500m和-Xmx3000m。但是在运行30/45分钟后,它会让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有内存泄漏吗?

2 个答案:

答案 0 :(得分:1)

请尝试最新版本的HtmlUnit。我们已经解决了很多内存问题。至少2.23有一些关于历史的修正案。 此外,您现在可以控制历史记录大小。

答案 1 :(得分:0)

问题可能是所有页面仍然存储在历史记录中。

我以这种方式禁用浏览历史记录:

DB::table('sub_category as sc')
    ->leftJoin('products as p', 'p.sub_cat_id', '=', 'sc.sub_cat_id')
    ->where('sc.category_id', '=', $categoryId)
    ->whereNotNull('p.sub_cat_id')
    ->select('p.*','sc.*', DB::raw('sc.sub_cat_id AS sub_cat_id'))
    ->groupBy('sc.sub_cat_id')
    ->get();

我从中得到了这个想法 how-to-limit-htmlunits-history-size

这些配置与您的问题无关,但在我的项目中有用:

    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");
    }