Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как увеличить размер кучи? java.lang.OutOfMemoryError 
V
    Опции темы
Bodro
Дата 24.3.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



В процессе работы кода (приложение и апплет - не важно) иногда появляется следующее сообщение:
Код

java.lang.OutOfMemoryError: Java heap space

Я так понимаю, что мне не хватает памяти. Вполне вероятно код не оптимальный, но всё же, как увеличить размер кучи?
Именно из кода.
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 24.3.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Bodro @  24.3.2009,  16:56 Найти цитируемый пост)
Именно из кода.

Никак.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Bodro
Дата 24.3.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Цитата(LSD @  24.3.2009,  16:57 Найти цитируемый пост)
Никак. 

Ответ последовал быстро, но не порадовал.
Получается выход один? Исправлять код?
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
LSD
Дата 24.3.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Можно поправить скрипт который запускает приложение.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
onsh76
Дата 25.3.2009, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 20.11.2005
Где: Beautiful BC

Репутация: нет
Всего: 5



Цитата(Bodro @ 24.3.2009,  16:56)
Вполне вероятно код не оптимальный, но всё же, как увеличить размер кучи? Именно из кода.


Из кода, вызовом какого-либо метода - не знаю, думаю что нет такого добра в Java.
Вам нужно найти причину почему вылетает OOM exception...

При старте JVM  Вы можете передать переменные и значения, задающие поведение JVM. 

У меня был случай с Томкэтом, когда веб приложение отваливалось по OOM exception...
Изменили дефолтовое значение MaxPermSize - болезнь вылечилась.Пример:
JAVA_OPTS should be set to: “-Xss128k -server -Xms512m -Xmx512m -XX:MaxPermSize=256m“

Смотрите первоисточник...



PM MAIL   Вверх
niasilil
Дата 25.3.2009, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



ага, добавь -Xmx512m  (или больше) и будет тибе щасье smile
запускай как то так 

java -jar -Xmx756m Test.jar

PS у меня недавно ant билдер вылетал, вот уж никогда бы не подумал. Пришлось добавлять параметры. Хотя бред, по моему. Можно было по дефолту такие включить.


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
Bodro
Дата 16.4.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Так вот. Опишу проблему более детально. По крайней мере попытаюсь.
У меня есть приложение. Оно довольно большое и в процессе работы может поедать довольно много памяти.
Я запускаю это приложение и оно работает вполне корректно. Ничто не падает. Запускаю так:
Код

SET RIGHTSIZER_CLASSPATH=dist\RightSizer.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\AbsoluteLayout.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\activation.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\axis-vkernel-patch.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\commons-discovery-0.2.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\commons-logging-1.0.4.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\jaxen-core.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\jaxen-jdom.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\jaxrpc.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\jdom.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\log4j-1.2.8.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\log4j-1.2.15.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\mailapi.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\piccolo.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\piccolox.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\saxpath.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\smtp.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\vim.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\vim25.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\wbem.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\wsdl4j-1.5.1.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\xalan.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\xerces.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\xml-apis.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\VKUtils.jar
SET RIGHTSIZER_CLASSPATH=%RIGHTSIZER_CLASSPATH%;dist\VKUtilsVim.jar

java -classpath %RIGHTSIZER_CLASSPATH% com.vkernel.rightsizer.Main

Всё отрабатывает без проблем!

Но конечному пользователю надо поставить один файл. Поэтому принято решение всё запихать в один jar, используя проект One-Jar (http://one-jar.sourceforge.net/). Всё это работает под JRE 1.6, не ниже. Поэтому решено было написать ещё загрузчик, который собирается под старую версию 1.2. Всё это находится в одном jar файле. Таким образом, запуская Jar, сначала мы передаём управление этому загрузчику. Он проверяет версию JRE. Если версия 1.6 и выше, то загружаем загрузчик One-Jar:
Код

// Другой код

        // Проверка версии и загрузка загрузчика OneJar и передача ему управления 
        if(verNum >= MIN_VERSION){
            System.out.println("OK");

            comparemyvm = Class.forName(LOAD_CLASS_NAME);
            comparemyvm.newInstance();

            params = new Class[1];
            params[0] = String[].class;

            m = comparemyvm.getMethod("main", params);

            m.invoke(null, new Object[] {args});
        }else{
            System.out.println("FAILED");
            System.out.println("The application requires a Java Runtime Environment 1.6 or later");
            System.out.println("http://java.com/download");

            ErrorFrame frame = new ErrorFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            frame.setResizable(false);
            frame.setTitle("Wrong Java version");
        }

// Другой код

    public static final double MIN_VERSION  = 1.6;
    public static final String LOAD_CLASS_NAME = "com.simontuffs.onejar.Boot";

// Другой код

Этот загрузчик уже загружает проект и запускает его. В принципе, схема нормальная и работает. Но когда приложению требуется много памяти, то всё рушится. Вылетает OutOfMemory. Долго возился с причиной, версий много, но пока чёткой нет. Я так и не смог найти подробное описание работы HotSpot и вообще всех частей JVM. Однако проблему решил следующий способ запуска:
Код

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\WORK\TEMP\DUMP -Xms150m -Xmx1000m -jar SnapshotMyvM.jar > logfile.txt 2>&1

Т.е. я задал вручную инициализируемый размер кучи и максимальный размер кучи. После этого всё работает! Ничто не падает. OutOfMemory не возникает.

Я не до конца понимаю как работает JVM. Почему задание вручную размера кучи решает ситуацию? Какой размер по умолчанию у неё? Почему добавление системы BootStrap приводит к выпадению OutOfMemory? Ведь когда запускаешь без этих двух загрузчиков, то всё работает.

Так вот. Проблема всё таки решилась заданием -Xms150m -Xmx1000m. Но не могу же я пользователям писать чтобы они запускали апплет из коммандной строки с этими параметрами. Существует ли способ задания этих опций в файле Manifest или ещё каким-либо программным образом?
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_and
Дата 16.4.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-developer
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 6.8.2004
Где: Новокузнецк

Репутация: 1
Всего: 4



Цитата(Bodro @  16.4.2009,  15:21 Найти цитируемый пост)
Почему добавление системы BootStrap приводит к выпадению OutOfMemory? Ведь когда запускаешь без этих двух загрузчиков, то всё работает.

попробуй поработать профайлером и выявить кто жрет много памяти и если это твой код то правь его если нет то скорее всего придется пользоваться этими параметрами
Цитата(Bodro @  16.4.2009,  15:21 Найти цитируемый пост)
Так вот. Проблема всё таки решилась заданием -Xms150m -Xmx1000m. Но не могу же я пользователям писать чтобы они запускали апплет из коммандной строки с этими параметрами. Существует ли способ задания этих опций в файле Manifest или ещё каким-либо программным образом?

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

в IDEA  вроде параметры такие проставляются в файле проперти но запускается чере файл idea.exe

Это сообщение отредактировал(а) _and - 16.4.2009, 11:38
PM MAIL ICQ Jabber   Вверх
Bodro
Дата 16.4.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Цитата(_and @  16.4.2009,  11:35 Найти цитируемый пост)
попробуй поработать профайлером и выявить кто жрет много памяти и если это твой код то правь его если нет то скорее всего придется пользоваться этими параметрами

Самое печальное, что у меня всё работает и не падает. Падает у тестеров. Хотя машины одни и теже вроде. Мне непонятно, по какой причине GC не освобождает память??? Запускал с флагом -verbose:GC, но что-то не увидел сообщений от GC. По идее, если он отрабатывать будет, то падать не должно. Хотя я не знаю. Может и правда памяти не хватает. Но кто ограничил её??? Почему без загрузчиков всё работает?
Свой код я и так уже переправлял! Уж не знаю что там не так!

Цитата(_and @  16.4.2009,  11:35 Найти цитируемый пост)
программно не седлать такого, напиши батник который бы пользователи пускали а в нем уже все параметры проставленные 

bat-файл писать нельзя. Должен быть один jar. Чтобы пользователь кликнул по нему мышью и всё заработало. Да к тому же нужна кроссплатформенность.

Цитата(_and @  16.4.2009,  11:35 Найти цитируемый пост)
в IDEA  вроде параметры такие проставляются в файле проперти но запускается чере файл idea.exe

Приложение должно быть кросспалтформенным. По крайней мере Windows и Linux.

А как нибудь при сборке может можно задать?

Это сообщение отредактировал(а) Bodro - 16.4.2009, 12:00
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_and
Дата 16.4.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-developer
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 6.8.2004
Где: Новокузнецк

Репутация: 1
Всего: 4



а если при клике на jar запускать какой-нить клас который после этого будет вызывать твой апплет с нужными параметрами, типа
Код

Runtime.getRuntime().exec(< команда запуска >);

PM MAIL ICQ Jabber   Вверх
Bodro
Дата 16.4.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Цитата(_and @  16.4.2009,  12:02 Найти цитируемый пост)
а если при клике на jar запускать какой-нить клас который после этого будет вызывать твой апплет с нужными параметрами, типа
    
Runtime.getRuntime().exec(< команда запуска >);

Да вообще как то странно! К тому же всё в одном файле. Нужно указывать разные точки входа. Одна при клике по умолчанию, вторая точка это мой загрузчик. Да к тому же там и так уже два загрузчика: мой и One-Jar. И не уверен я что это будет нормально работать. Да к тому же это некрасиво. Это не пойдёт!

Смотри. Нашёл вот такие статьи: http://www.ibm.com/developerworks/ru/edu/j...t/section4.htmlhttp://javahowto.blogspot.com/2006/06/fix-...emoryerror.html.
Так что можно указать размер кучи при компиляции. Сейчас попробую и скажу.
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
math64
Дата 16.4.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно в манифесте прописать какие дополнительные jar нужны для запуска RightSizer.jar
Тогда можно запускать командой java -jar RightSizer.jar
Для инталяции можно в RightSizerInstall.jar запаковать нужные jar и RightSizerInstall.class, который будет их распаковывать в указанную пользователем папку и добавлять ссылку на десктоп.
PM   Вверх
Bodro
Дата 16.4.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Цитата(math64 @  16.4.2009,  13:45 Найти цитируемый пост)
Можно в манифесте прописать какие дополнительные jar нужны для запуска RightSizer.jar
Тогда можно запускать командой java -jar RightSizer.jar
Для инталяции можно в RightSizerInstall.jar запаковать нужные jar и RightSizerInstall.class, который будет их распаковывать в указанную пользователем папку и добавлять ссылку на десктоп. 

Да нельзя так делать! Я пишу коммерческое ПО. Если у пользователя нет прав на создание папок? Никаких инсталляторов, никаких распаковок и прочего. Должен быть один файл. Его надо запустить и чтобы всё работало.

В общем посмотрел я те статьи, проанализировал.
Могу предложить 4 способа задания фиксированного размера кучи. Возможно их больше.

1 способ:
указываем в ant-срипте для сборки:
Код

<javac fork="true"
       srcdir="${basedir}/src"
       destdir="${basedir}/build/classes"
       classpath="${project.classpath}"
       memoryinitialsize="256m"
       memorymaximumsize="256m">
</javac>

memoryinitialsize="256m"
memorymaximumsize="256m"

2 способ:
указываем в виде дополнительных опций компилятору
Код

javac -d build/classes -classpath ... -J-Xms256m -J-Xmx256m


3 способ:
указываем переменные окружения для ant
Код

export ANT_OPTS="-Xms256m -Xmx256m"    (ksh/bash)
setenv ANT_OPTS="-Xms256m -Xmx256m"    (tcsh/csh)
set ANT_OPTS="-Xms256m -Xmx256m"       (Windows)


4 способ:
запускаем саму программу с нужными параметрами
Код

java -Xms150m -Xmx1000m -jar SnapshotMyvM.jar


Пробовал 1, 3, 4 способ. Работает только 4-й способ.
Посколько проект содержит два загрузчика, один из которых собирал не я, то я делал так:
Собирал свой загрузчик со следующими параметрами:
Код

<javac 
            fork="true"
            memoryinitialsize="150m"
            memorymaximumsize="1000m"
            source="1.2"
            target="1.1"
            debug="true"
            debuglevel="lines,source"
            srcdir="${loader-src.dir}"
            destdir="${loader-dst.dir}">
            <compilerarg value="-Xlint:unchecked" />
</javac>

Собирал файлы программы так же. Выставлял переменные окружения. Не помогает! Помогает только запуск с нужными параметрами (способ 4). Возможно необходимо One-Jar пересобрать с такими опциями. Но не думаю что в этом дело. Хотя не знаю точно.

В чём может быть причина то?
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Bodro
Дата 16.4.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань

Репутация: 1
Всего: 4



Ха, читал я не внимательно! Написано же:
Цитата

When javac is compiling a large number of java source files, it may fail with java.lang.OutOfMemoryError:

Эти те первые три способа что я указал вверху говорят именно javac что нужно собираться с такой кучей. Но на class файлах это никак не отображается! Получается мне подходит только четвёртый способ!
Потому что мне нужно во время выполнения много памяти. Компиляция проходит нормально.

Это сообщение отредактировал(а) Bodro - 16.4.2009, 15:07
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
_and
Дата 17.4.2009, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-developer
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 6.8.2004
Где: Новокузнецк

Репутация: 1
Всего: 4



я тебе не зря по-моему предложил сделать точку входа по умолчанию класс который будет вызывать нужный с определенными параметрами и чего в этом не красивого. Для твоего варианта это по-моему единственный выход IMHO/
просто покопай в эту сторону еще может интересного найдешь ну и соответственно с нами поделись как найдешь  smile 
PM MAIL ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1085 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.