java.lang.OutOfMemoryError: пространство кучи Java - PullRequest
16 голосов
/ 06 октября 2009

при использовании Jruby я получаю это сообщение.

Complete Java stackTrace
java.lang.OutOfMemoryError: Java heap space

как решить?

Ответы [ 9 ]

17 голосов
/ 15 января 2011

TLDR: jruby -J-Xmx1024m script_you_want_to_run.rb

Как уже упоминалось, ваша программа пытается выделить больше памяти, чем максимальный размер, который JVM может выделить.

Также, как уже упоминали другие, вы можете настроить Java, чтобы разрешить выделение большего объема памяти, сообщив об этом через командную строку с аргументом -Xmx1024m (в качестве примера).

-Xmx - это аргумент для максимальной памяти, а 1024m - это объем памяти (последний мегабайт для мегабайта). Я думаю, что JRuby запускает JVM с максимальной памятью, уже установленной на 512 м, так что вы, вероятно, захотите подняться выше.

Чтобы отправить аргументы JVM из командной строки с помощью jruby, вам необходимо добавить -J перед аргументом, чтобы ваша командная строка выглядела так:

jruby -J-Xmx1024m script_you_want_to_run.rb

Я также согласен с мнением об утечке памяти: если вы на самом деле не имеете дело с кучей объектов с ожиданием того, что вы можете увидеть эту ошибку, то вам может потребоваться возможность непредвиденного побочные эффекты.

10 голосов
/ 05 сентября 2013

Настройка JRUBY_OPTS - это решение, которое работает лучше всего для меня. Это было упомянуто в ответе Корая.

set JRUBY_OPTS=-J-Xmx2g
9 голосов
/ 06 октября 2009

Вы можете настроить размер кучи JVM, используя опции -Xmx и -Xms JVM: -Xmx для максимального размера кучи и -Xms для начального размера кучи. E.g.:

java -Xms128m -Xmx256m BigApp

Обычно я использую одинаковые настройки для начального и максимального размера кучи.

В вашем случае, действительно трудно сказать, как определить размер JVM без дополнительной информации о том, что вы делаете, когда возникает проблема ... Или, может быть, у вас просто есть утечка памяти где-то и увеличение размера кучи, выиграл ' Это не поможет, но проблема возникнет позже. В этом случае единственным решением является устранение утечки.

Не в последнюю очередь, всегда имейте в виду, что чем больше куча, тем длиннее основной GC .

4 голосов
/ 08 апреля 2013

проверьте версию Jruby JVM с помощью этой команды

jruby -v

Если он возвращает эту строку, это означает, что вы используете 32-битную JVM, поэтому вы не можете установить максимальный размер кучи> = 2 ГБ

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) Client VM 1.6.0_37-b06 [Windows 7-x86]

Вам необходимо установить JAVA_HOME на 64-битную версию Java. например,

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09

Вы увидите следующие выходные данные, если снова наберете команду jruby -v

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_09-b05 [Windows 7-amd64]

Вы видите, что вы используете 64-битную версию JVM. После этого вы можете установить любой параметр среды jruby opts следующим образом

set JRUBY_OPTS=-J-Xmx2g

или вы можете запустить вашу программу следующим образом

jruby -J-Xmx2g <your ruby program>
3 голосов
/ 06 октября 2009

Увеличение размера дампа кучи может быть только бинтом. Вам необходимо сгенерировать дамп кучи, добавив правильный аргумент:

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512

Это создаст файл, похожий на java _ *. Hprof. Затем вы можете использовать набор инструментов с открытым исходным кодом для анализа дампа кучи. Java 1.6 поставляется с JHat, который немного глючит и плохо анализирует большие кучи. Я использую этот удивительный плагин Eclipse: Eclipse Memory Analyzer .

Как только отчет сгенерирован из дампа кучи, вы можете увидеть, какие классы занимают больше всего памяти, и вы можете использовать это как отправную точку для отладки вашего кода, чтобы обнаружить любые утечки памяти.

2 голосов
/ 06 октября 2009

вы можете установить максимальный размер кучи в командной строке:

java -Xmx512m MyClass
1 голос
/ 31 мая 2011

Сообщение «Пространство кучи Java» указывает на то, что новые объекты не могут быть размещены в куче Java. Ошибка не обязательно означает утечку памяти приложения. Проблема может быть такой же простой, как проблема конфигурации, когда указанный размер кучи (или размер по умолчанию, если не указан) недостаточен для приложения.

Потенциальные источники этой ошибки и решения: http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp

1 голос
/ 06 октября 2009

Либо у вас утечка памяти, и вам нужно найти причину, либо вам нужно выделить больше места в Java:

java -Xmx512m ...
0 голосов
/ 27 июля 2014

Я сталкиваюсь с подобной проблемой и не могу найти удовлетворительного решения после поиска в течение нескольких часов. Если все, что вам нужно, это установить параметры Xms и Xmx, вот что работает для меня:

ps aux | grep java

Узнайте, что на самом деле работает Джруби. Убей его (kill -9 process_id). Повторите команду с собственными параметрами Java в командной строке.

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

Кстати, я использую сервер puma с Jruby на Rails 4.0, и если кто-нибудь знает более элегантное решение, пожалуйста, дайте мне знать. Я перепробовал все (after_use_hook, .rvmrc, .bashrc и т. Д. И т. Д.)

Спасибо.

...