java.lang.OutOfMemoryError in Java

匿名 (未验证) 提交于 2019-12-03 02:28:01

问题:

I want to login to ORKUT through a java progrram without involving IE or Firefox,

I am using HTMLUnit for this in the following manner:

import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; import com.gargoylesoftware.htmlunit.html.HtmlTextInput; import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;  public class HtmlUnit { public void submittingForm() throws Exception {     final WebClient webClient = new WebClient();      // Get the first page     final HtmlPage page1 = webClient.getPage("https://www.google.com/accounts/ServiceLogin?service=orkut&hl=en-US&rm=false&continue=http%3A%2F%2Fwww.orkut.com%2FRedirLogin%3Fmsg%3D0%26page%3Dhttp%253A%252F%252Fwww.orkut.co.in%252FHome.aspx&cd=IN&passive=true&skipvpage=true&sendvemail=false");     System.out.println("Page1: " + page1.toString());      // Get the form that we are dealing with and within that form,     // find the submit button and the field that we want to change.      final HtmlSubmitInput button = page1.getElementByName("signIn");     final HtmlTextInput userName = page1.getElementByName("Email");     final HtmlPasswordInput password = page1.getElementByName("Passwd");      // Change the value of the text field     userName.setValueAttribute("username");     password.setValueAttribute("password");      // Now submit the form by clicking the button and get back the second page.     final HtmlPage page2 = button.click();     System.out.println("Page2: " + page2.toString()); }  public static void main(String[] args) {     try {         new HtmlUnit().submittingForm();     }catch(Exception ex) {         ex.printStackTrace();     } } }

But after running the above program, I got the following error:

Page1: HtmlPage(https://www.google.com/accounts/ServiceLogin?service=orkut&hl=en-US&rm=false&continue=http%3A%2F%2Fwww.orkut.com%2FRedirLogin%3Fmsg%3D0%26page%3Dhttp%253A%252F%252Fwww.orkut.co.in%252FHome.aspx&cd=IN&passive=true&skipvpage=true&sendvemail=false)@6011238  Sep 15, 2009 4:54:37 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify WARNING: Expected content type of 'application/javascript' or 'application/ecmascript' for remotely loaded JavaScript element at 'http://static1.orkut.com/js/gen/in_frame046.js', but got 'application/x-javascript'. Sep 15, 2009 4:54:38 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify WARNING: Expected content type of 'application/javascript' or 'application/ecmascript' for remotely loaded JavaScript element at 'http://static1.orkut.com/js/gen/gtalk_client031.js', but got 'application/x-javascript'. Sep 15, 2009 4:54:38 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify WARNING: Expected content type of 'application/javascript' or 'application/ecmascript' for remotely loaded JavaScript element at 'http://static1.orkut.com/ifpc/ifpc.js', but got 'application/x-javascript'. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space     at net.sourceforge.htmlunit.corejs.javascript.ObjToIntMap.rehashTable(ObjToIntMap.java:330)     at net.sourceforge.htmlunit.corejs.javascript.ObjToIntMap.ensureIndex(ObjToIntMap.java:415)     at net.sourceforge.htmlunit.corejs.javascript.ObjToIntMap.intern(ObjToIntMap.java:197)     at net.sourceforge.htmlunit.corejs.javascript.TokenStream.getToken  (TokenStream.java:435)     at net.sourceforge.htmlunit.corejs.javascript.Parser.peekToken(Parser.java:313)     at net.sourceforge.htmlunit.corejs.javascript.Parser.variables(Parser.java:1791)     at net.sourceforge.htmlunit.corejs.javascript.Parser.statementHelper         (Parser.java:959)     at net.sourceforge.htmlunit.corejs.javascript.Parser.statement(Parser.java:877)     at net.sourceforge.htmlunit.corejs.javascript.Parser.parse(Parser.java:549)     at net.sourceforge.htmlunit.corejs.javascript.Parser.parse(Parser.java:492)     at net.sourceforge.htmlunit.corejs.javascript.Context.compileImpl(Context.java:2404)     at net.sourceforge.htmlunit.corejs.javascript.Context.compileString(Context.java:1375)     at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory$TimeoutContext.compileString(HtmlUnitContextFactory.java:173)     at net.sourceforge.htmlunit.corejs.javascript.Context.compileString(Context.java:1364)     at com.gargoylesoftware.htmlunit.javascript.host.Window.custom_eval(Window.java:1143)     at com.gargoylesoftware.htmlunit.javascript.host.Window.jsxFunction_execScript(Window.java:1122)     at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     at java.lang.reflect.Method.invoke(Method.java:597)     at net.sourceforge.htmlunit.corejs.javascript.MemberBox.invoke(MemberBox.java:161)     at net.sourceforge.htmlunit.corejs.javascript.FunctionObject.call(FunctionObject.java:476)     at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1688)     at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:845)     at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164)     at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:427)     at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:263)     at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3058)     at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:175)     at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$5.doRun(JavaScriptEngine.java:415)     at                 com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:520)     at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:529)     at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:536)

So, I don't understand where the problem is. The error occurs while executing the following line:

final HtmlPage page2 = button.click();

回答1:

The name of error gives a hint: the Java virtual machine needs more memory. You can increase heap space by adding the flag '-Xmx128M' to the jvm (or increasing the integer value just in case, the java call already has a Xmx parameter with a smaller value.

With the example above you'll have 128 MByte heap space.



回答2:

I think you need to find out what happens on clicking submit/sign-in because I doubt the jvm should run out of memory while doing this. Maybe it goes in some kind of an infinite loop and keeps downloading data? Maybe Google's sign-in recognizes when a non browser tries logging in?



回答3:

Try increasing the amount of heap space you are launching your application with; e.g.

java -Xmx256M ...


回答4:

You might also need to increase permSize at some point... so use the following to avoid both:

java -Xmx512m -XX:MaxPermSize=256m ...



回答5:

You are getting java.lang.OutOfMemoryError: Java heap space

1) Easy way to solve OutOfMemoryError in java is to increase the maximum heap size by using JVM options "-Xmx512M", this will immediately solve your OutOfMemoryError.

This is my preferred solution when I get OutOfMemoryError in Eclipse, Maven or ANT while building project because based upon size of project you can easily ran out of Memory.here is an example of increasing maximum heap size of JVM.

Also its better to keep -Xmx to -Xms ration either 1:1 or 1:1.5 if you are setting heap size in your java application

export JVM_ARGS="-Xms1024m -Xmx1024m"

2) Second way to resolve OutOfMemoryError in Java is rather hard and comes when you don't have much memory and even after increase maximum heap size you are still getting java.lang.OutOfMemoryError, in this case you probably want to profile your application and look for any memory leak.

If you are using Eclipse IDE,you can use Eclipse Memory Analyzer to examine your heap dump or you can use any profiler like Netbeans or JProbe. This is tough solution and requires some time to analyze and find memory leaks.

3) There are many Tools to investigate and fix OutOfMemoryError in Java

----> Visualgc

Visualgc stands for Visual Garbage Collection Monitoring Tool and you can attach it to your instrumented hostspot JVM. Main strength of visualgc is that it displays all key data graphically including class loader, garbage collection and JVM compiler performance data. The target JVM is identified by its virtual machine identifier also called as vmid.

----> Jmap

Jmap is a command line utility comes with JDK6 and allows you to take a memory dump of heap in a file. It’s easy to use as shwon below:

jmap -dump:format=b,file=heapdump 6054

Here file specifies name of memory dump file which is "heapdump" and 6054 is PID of your Java progress. You can find the PDI by using "ps -ef” or windows task manager or by using tool called "jps"(Java Virtual Machine Process Status Tool).

----> Jhat

Jhat was earlier known as hat (heap analyzer tool) but it is now part of JDK6. You can use jhat to analyze heap dump file created by using "jmap". Jhat is also a command line utility and you can rum it from cmd window as shown below:

jhat -J-Xmx256m heapdump

Here it will analyze memory-dump contained in file "heapdump". When you start jhat it will read this heap dump file and then start listening on http port, just point your browser into port where jhat is listening by default 7000 and then you can start analyzing objects present in heap dump.

Hope this will help.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!