Java 使用HtmlUnit进行刮片时发生OutOfMemoryError

Java 使用HtmlUnit进行刮片时发生OutOfMemoryError,java,web-scraping,tomcat7,htmlunit,Java,Web Scraping,Tomcat7,Htmlunit,我使用HtmlUnit登录到一个站点,然后从表中下载数据 运行代码时,我的代码正在导致java.lang.OutOfMemoryError,无法进一步运行 以下是我的代码: WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_6); webClient.getOptions().setJavaScriptEnabled(true); webClient.getOptions().setCssEnabled(fa

我使用HtmlUnit登录到一个站点,然后从表中下载数据

运行代码时,我的代码正在导致
java.lang.OutOfMemoryError
,无法进一步运行

以下是我的代码:

WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_6);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setRedirectEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);
                            webClient.getOptions().setPrintContentOnFailingStatusCode(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setTimeout(50000);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setPopupBlockerEnabled(true);

HtmlPage htmlPage=webClient.getPage(url);
Thread.sleep(200);
                            //~~~~~~~Log-In
HtmlTextInput uname=(HtmlTextInput)htmlPage.getFirstByXPath("//*[@id=\"username\"]");
uname.setValueAttribute("xxx");
HtmlPasswordInput upass=(HtmlPasswordInput)htmlPage.getFirstByXPath("//*[@id=\"password\"]");
upass.setValueAttribute("xxx");
HtmlSubmitInput submit=(HtmlSubmitInput)htmlPage.getFirstByXPath("//*[@id=\"login-button\"]/input");
htmlPage=(HtmlPage) submit.click();
Thread.sleep(200);
webClient.waitForBackgroundJavaScript(10000);
for (int i = 0; i < 250; i++) {
 if (!htmlPage.asText().contains("Loading...")) {
     break;
  }
    synchronized (htmlPage) {
     htmlPage.wait(500);
 }
}

System.out.println(htmlPage.asText());
我在catlina.sh文件中放了以下几行来分配堆内存,但仍然得到了相同的错误(我的RAM大小是2GB)


我会设置并使用这样的工具。

如果您在最后一行代码中包含此$JAVA\u OPTS,祝您的代码正常工作

JAVA_OPTS="$JAVA_OPTS -server -XX:+UseConcMarkSweepGC"

查看堆栈跟踪,您可以看到它经常递归。这似乎不是整个堆栈跟踪-您截断了多少?我只是从堆栈跟踪中找出了原因。在这个堆栈跟踪中,没有代码的迹象,这就是为什么我说您截断了它。在某些情况下,代码中应该有一行(或一行表示……1234行或更多行),因为这是由HtmlUnit引起的。stackstaceThanks rajendra中没有提到代码中的任何行。。。我在catlina.sh中写错了最后一行,我已经更改了它。现在它工作了,谢谢。
if [ -z "$LOGGING_MANAGER" ]; then
     JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
else
     JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"
fi

# Uncomment the following line to make the umask available when using the
# org.apache.catalina.security.SecurityListener
   JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
   JAVA_OPTS="$JAVA_OPTS  -Xms512m -Xmx2048m -XX:MaxPermSize=512m"
   JAVA_OPTS="-server -XX:+UseConcMarkSweepGC"
JAVA_OPTS="$JAVA_OPTS -server -XX:+UseConcMarkSweepGC"