java.lang.OutOfMemoryError в Java - PullRequest
       39

java.lang.OutOfMemoryError в Java

2 голосов
/ 15 сентября 2009

Я хочу войти в ORKUT через Java-программу без использования IE или Firefox,

Я использую HTMLUnit для этого следующим образом:

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();
    }
}
}

Но после запуска вышеуказанной программы я получил следующую ошибку:

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)

Итак, я не понимаю, в чем проблема. Ошибка возникает при выполнении следующей строки:

final HtmlPage page2 = button.click();

Ответы [ 5 ]

4 голосов
/ 15 сентября 2009

Имя ошибки подсказывает: виртуальной машине Java требуется больше памяти. Вы можете увеличить пространство кучи, добавив флаг '-Xmx128M' к jvm (или увеличив целое значение на всякий случай, при вызове java уже есть параметр Xmx с меньшим значением.

В приведенном выше примере у вас будет 128 МБ кучи.

2 голосов
/ 15 сентября 2009

Я думаю, что вам нужно выяснить, что происходит при нажатии на кнопку отправить / войти, потому что я сомневаюсь, что jvm не хватит памяти при этом. Может быть, он идет по какому-то бесконечному циклу и продолжает загружать данные? Может быть, вход в Google распознает, когда не браузер пытается войти в систему?

2 голосов
/ 15 сентября 2009

Попробуйте увеличить объем кучи, с которой вы запускаете приложение; например,

java -Xmx256M ...
0 голосов
/ 11 июня 2015

Вы получаете java.lang.OutOfMemoryError: Java heap space

1) Простой способ решить OutOfMemoryError в java - это увеличить максимальный размер кучи с помощью параметров JVM "-Xmx512M", это немедленно решит вашу OutOfMemoryError.

Это мое предпочтительное решение, когда я получаю OutOfMemoryError в Eclipse, Maven или ANT при построении проекта, потому что в зависимости от размера проекта вы можете легко исчерпать память. Вот пример увеличения максимального размера кучи JVM.

Также лучше сохранять соотношение -Xmx к -Xms 1: 1 или 1: 1,5, если вы устанавливаете размер кучи в своем Java-приложении

export JVM_ARGS = "- Xms1024m -Xmx1024m"

2) Второй способ разрешить OutOfMemoryError в Java довольно сложен и возникает, когда у вас мало памяти и даже после увеличения максимального размера кучи вы все еще получаете java.lang.OutOfMemoryError, в этом случае вы, вероятно, захотите профилировать ваше приложение и ищите любую утечку памяти.

Если вы используете Eclipse IDE, вы можете использовать Eclipse Memory Analyzer для проверки своего дампа кучи или использовать любой профилировщик, например Netbeans или JProbe. Это сложное решение, требующее некоторого времени для анализа и обнаружения утечек памяти.

3) Существует множество инструментов для исследования и исправления OutOfMemoryError в Java

----> Visualgc

Visualgc означает инструмент визуального мониторинга сборки мусора, и вы можете присоединить его к вашей инструментированной JVM хост-точки. Основным преимуществом visualgc является то, что он отображает все ключевые данные графически, включая загрузчик классов, сборщик мусора и данные о производительности компилятора JVM. Целевая JVM идентифицируется по идентификатору виртуальной машины, также называемому vmid.

----> Jmap

Jmap - это утилита командной строки, поставляемая с JDK6 и позволяющая получить дамп памяти кучи в файле. Это легко использовать как показано ниже:

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

Здесь файл указывает имя файла дампа памяти, который является "heapdump", а 6054 - PID вашего прогресса Java. Вы можете найти PDI с помощью "ps -ef" или диспетчера задач Windows или с помощью инструмента под названием "jps" (Инструмент состояния процесса виртуальной машины Java).

----> Jhat

Jhat ранее был известен как hat (инструмент для анализа кучи), но теперь он является частью JDK6. Вы можете использовать jhat для анализа файла дампа кучи, созданного с помощью "jmap". Jhat также является утилитой командной строки, и вы можете просмотреть ее из окна cmd, как показано ниже:

jhat -J-Xmx256m heapdump

Здесь будет проанализирован дамп памяти, содержащийся в файле "heapdump". Когда вы запустите jhat, он прочитает этот файл дампа кучи, а затем начнет прослушивать порт http, просто укажите свой браузер на порт, где jhat прослушивает по умолчанию 7000, а затем вы можете начать анализ объектов, присутствующих в дампе кучи.

Надеюсь, это поможет.

0 голосов
/ 15 сентября 2009

Вам также может понадобиться увеличить permSize в какой-то момент ... поэтому используйте следующее, чтобы избежать обоих:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...