Java.lang.OutOfMemoryError in Java

I want to login to ORKUT via java progrram without IE or Firefox involved,

I am using HTMLUnit to do this like this:

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 when the following line is executed:

final HtmlPage page2 = button.click();

      

+2


source to share


5 answers


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



In the example above, you will have 128 megabytes of heap space.

+4


source


Try to increase the amount of heap of space from which you launch the application; eg.



java -Xmx256M ...

      

+2


source


I think you need to figure out what happens when submit / sign-in is pressed because I doubt the jvm should end up running out of memory when doing so. Maybe this happens in some kind of endless loop and keeps loading data? Maybe Google login is recognized when not browsing the browser?

+2


source


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

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

0


source


You get java.lang.OutOfMemoryError: Java heap space

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

This is my preferred solution when I get an OutOfMemoryError in Eclipse, Maven, or ANT when building a project, because based on the size of the project, you can easily run out of memory. Following is an example of increasing the maximum JVM heap size.

It is also better to store -Xmx before -Xms ration either 1: 1 or 1: 1.5 if you are setting the heap size in your java application

export JVM_ARGS = "- Xms1024m -Xmx1024m"

2) The second way to resolve OutOfMemoryError in Java is quite tricky and comes when you are low on memory and even after increasing the maximum heap size you still get java.lang.OutOfMemoryError, in which case you probably want to view your application profile and search memory leak.

If you are using the Eclipse IDE, you can use the Eclipse Memory Analyzer to examine your heap heaps, or you can use any profiler like Netbeans or JProbe. This is a tricky solution and takes 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 Tool and you can attach it to your JVM with tool host. The main strength of visualgc is that it displays all key data graphically, including class loading, garbage collection, and JVM compiler performance data. The target JVM is identified by a virtual machine id, also called vmid.

----> Jmap

Jmap is a command line utility that comes with JDK6 and allows you to take a bunch of memory into a file. It's easy to use like shwon below:

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

Here the file specifies the name of the memory dump file which is "heapdump" and 6054 is the PID of your Java progress. You can find the PDI with "ps -ef" or the Windows Task Manager, or with a tool called "jps" (Java Virtual Machine Process Status Tool).

----> Jhat

Jhat was formerly known as a hat (heap analysis tool) but is now part of JDK6. You can use jhat to parse a heap dump file generated with "jmap". Jhat is also a command line utility and you can run it from a CMD window as shown below:

jhat -J-Xmx256m heapdump

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

Hope this helps.

0


source







All Articles