# HTMLUnit, JavaScript und Heap Space Problem



## paldawin (3. Feb 2009)

Hallo,

ich benutze das HTMLUnit-Framework um einen Webcrawler zu entwickeln. Hierbei stoß ich jedoch auf ein Problem, bei der Verarbeitung von Javascript. Wenn ich sehr viele JS-Aufrufe verarbeite (so bei 100) bekomme ein Heap-Space Problem! Meine Anwendung läuft mit 128 MB. Wenn ich Seiten verarbeite bei dem kein JS verarbeitet wird, bekomm ich kein Problem.
Ich habe das Problem schon gegooglet jedoch nichts brauchbares gefunden. Bei jedem Laden einer Webseite mir ein neues WebClient-Objekt zu erstellen wäre zwar möglich, jedoch würde ich dabei schon bestehnde Cookies und somit schon bestätigte Disclaimer von Webseiten verlieren!
Ich konnte das Problem soweit einschränken das ich weiß das mein WebClient-Objekt irgendwie mit der Zeit zuviel Daten über die Javascriptaufrufe ansammelt, jedoch hab ich noch keinen Weg gefunden diese zu löschen!
Wollt deswegen mal nachfragen, ob sich jemand mit dem Framework auskennt und mir einen Tipp geben kann!

Verarbeitung von JavaScript:

```
ScriptResult result = page.executeJavaScript(javascript);
page.getEnclosingWindow().getThreadManager().joinAll(10000);
HtmlPage executedPage = (HtmlPage) result.getNewPage();
```

Laden einer Webseite:

```
try {
        HtmlPage page = (HtmlPage) client.getPage(url);
	cache.addUrl(url);
	return page;
} catch (Exception e) {				
	throw new NullPageException("Fehler beim Laden der Seite: " +url);
}
```


----------



## paldawin (6. Feb 2009)

Problem gelöst!


----------



## HoaX (6. Feb 2009)

Offensichtlicher Programmierfehler deinerseites oder woran lags? Lass uns nicht dumm sterben ...


----------



## paldawin (6. Feb 2009)

Kein Programmierfehler meinerseits, liegt wahrscheinlich am HTMLUnit-Framework, das bei zuvielen Javscriptverarbeitungen zuviele Daten anhäuft. Habe es jetzt so gelöst das ich mit

```
boolean checkMemoryWorkload() {
	Runtime runtime = Runtime.getRuntime();
	double maxMemory = runtime.maxMemory();
	double totalMemory = runtime.totalMemory();
	double workload = totalMemory / maxMemory * 100;
	if(workload > 85) {
		return true;
	}
	return false;
}
```
überprüfe wieviel Speicher verbraucht wird und wenns kritisch wird, wird das ausgeführt

```
void reconfigWebConnection() {
		if(checkMemoryWorkload()) {
			CookieManager cookieManager = client.getCookieManager();
			setWebConfig(browserVersion, proxy, port, javascript);
			client.setCookieManager(cookieManager);
		}		
}

@Override
public void setWebConfig(BrowserVersion browserVersion, String proxyHost, int port, boolean js) {
	client = new WebClient(browserVersion);
	client.setTimeout(5000);
	client.setThrowExceptionOnScriptError(false);
	client.setJavaScriptEnabled(js);
	ProxyConfig config = client.getProxyConfig();		
	config.setProxyHost(proxyHost);
	config.setProxyPort(port);
}
```


----------

