I’m loading long pages into a WebView using loadData(), unfortunately after around 5 or 10 page links it gives an OutOfMemoryException. This is likely caused by the history holding the full data: url of every page.
I have a memory & cpu monitor in the status bar, and it always shows hardly any memory usage, so the app isn’t using up all memory. Is there a way to allow my app to use more memory, similar to Java’s command-line switches? Is there a way to make the webview more efficient, perhaps by making a cache on the sd card, to prevent this crash?
06-27 12:02:44.746: WARN/System.err(6692): java.lang.OutOfMemoryError
06-27 12:02:44.746: WARN/System.err(6692): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
06-27 12:02:44.746: WARN/System.err(6692): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:157)
06-27 12:02:44.746: WARN/System.err(6692): at java.lang.StringBuilder.append(StringBuilder.java:217)
06-27 12:02:44.746: WARN/System.err(6692): at android.webkit.BrowserFrame.startLoadingResource(BrowserFrame.java:710)
06-27 12:02:44.746: WARN/System.err(6692): at android.webkit.BrowserFrame.nativeLoadUrl(Native Method)
06-27 12:02:44.746: WARN/System.err(6692): at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:248)
06-27 12:02:44.746: WARN/System.err(6692): at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1564)
06-27 12:02:44.746: WARN/System.err(6692): at android.webkit.WebViewCore.access$1400(WebViewCore.java:52)
06-27 12:02:44.746: WARN/System.err(6692): at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:950)
06-27 12:02:44.746: WARN/System.err(6692): at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 12:02:44.746: WARN/System.err(6692): at android.os.Looper.loop(Looper.java:123)
06-27 12:02:44.746: WARN/System.err(6692): at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:623)
06-27 12:02:44.746: WARN/System.err(6692): at java.lang.Thread.run(Thread.java:1096)
06-27 12:02:44.746: WARN/dalvikvm(6692): threadid=8: thread exiting with uncaught exception (group=0x40020ac0)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): FATAL EXCEPTION: WebViewCoreThread
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): java.lang.OutOfMemoryError
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:157)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at java.lang.StringBuilder.append(StringBuilder.java:217)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.webkit.BrowserFrame.startLoadingResource(BrowserFrame.java:710)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.webkit.BrowserFrame.nativeLoadUrl(Native Method)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:248)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1564)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.webkit.WebViewCore.access$1400(WebViewCore.java:52)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:950)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.os.Looper.loop(Looper.java:123)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:623)
06-27 12:02:44.756: ERROR/AndroidRuntime(6692): at java.lang.Thread.run(Thread.java:1096)
The strange thing is, DDMS Heap view shows it had plenty of “Free” memory, but it still may give an error such as:
ERROR/dalvikvm-heap(10612): Out of memory on a 1153232-byte allocation.
I don’t know if it’s at all related, but sometimes it gives this warning when opening a page, before out-of-memory:
ERROR/Web Console(18033): SECURITY_ERR: DOM Exception 18: An attempt was made to break through the security policy of the user agent. at …
I switched to loadDataWithBaseURL, which doesn’t require URLEncoder encoding the url, and doesn’t keep huge data urls in the history. This seems to have fixed the high cpu use and memory leak, and the SECURITY_ERR: