我试图使用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有内存泄漏吗?
答案 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");
}