Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > java.lang.OutOfMemoryError


Автор: rrrookie 20.12.2006, 17:47
Привет!

Работаю с Веб Севисами на Аксис2. 

Когда запускаю метод сервисов который считывает много инофрмации из БД, вылетает

ЕТО -> Exception in thread main java.lang.OutOfMemoryError

С Аксисом работаю через Томкат6.

ЕстЬ решение тут -> http://forum.java.sun.com/thread.jspa?threadID=636872&messageID=3773026

Но как то не оченЬ работает....

Кто нитЬ может конкретно пояснитЬ: КАК УВЕЛИЧИТЬ памятЬ JAVA ?

JAVA -X - там всё описано, но не работает...

Спасибо

Автор: kkorsakoff 20.12.2006, 18:24
Различными -X параметрами. Скажи на какой конфигурации у тебя сейчас работает сервер. И с какими параметрами запускаешь томкат. Точнее виртуальную машину. 
Кстати java.lang.OutOfMemoryError они ведь тоже разные бывают.

Автор: rrrookie 20.12.2006, 18:34
Чтыо значит :"на какой конфигурации у тебя сейчас работает сервер"

Томкат 5.5.17

Добавляю параметр -Xmx512Mв переменную окружения JAVA_OPTS 

и запускаю startup.bat

Автор: w1nd 20.12.2006, 22:51
Цитата(rrrookie @  20.12.2006,  18:34 Найти цитируемый пост)
Добавляю параметр -Xmx512Mв переменную окружения JAVA_OPTS 

Добавьте к нему "-XX:PermSize=96m -XX:MaxPermSize=128m". Что получится?

Автор: kkorsakoff 21.12.2006, 01:35
Я имел ввиду сколько оперативки доступно вообще, чтоб  не забить всю память томкатом

Автор: rrrookie 21.12.2006, 11:36
Привет!

Допустим что количество памяти не ограничено...
На сервере 2Гб RAMa...

И JAVA_OPTS = -Xmx512M -XX:PermSize=96m -XX:MaxPermSize=128m

Тоже не помогло... 
Не получается увеличитЬ JVM heap size...


Автор: kkorsakoff 21.12.2006, 14:48
Откуда ты понимаешь, что не получается увеличить хип? Каким образом берешь эту информацию?
При вылете jvm должна создавать файл hs_err_pid<process id>.log
Туда же пишется состояние памяти. Может туда глянем?

Автор: rrrookie 22.12.2006, 13:10
OK, спасибо за помощ ;) 

УдалосЬ решитЬ проблему

Автор: KostenkoSergey 28.12.2006, 16:12
Цитата(w1nd @  20.12.2006,  22:51 Найти цитируемый пост)
XX:PermSize=96m -XX:MaxPermSize=128m
 а как это должно помочь ?

как решил проблему - интересно.

Автор: tmp13 20.2.2007, 13:09
всего у меня 512 оперативки!!

-Xmx512M указал такое в опциях Jdevelopera
Код

         StringBuffer isbuf=new StringBuffer();
         int minimumCapacity = 28000000;
         isbuf.ensureCapacity(minimumCapacity);
         MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();
         System.out.println(memorymbean.getHeapMemoryUsage());
         System.out.println(memorymbean.getNonHeapMemoryUsage());


(это часть кода... там всё сложнее сервлет процессы... и т.д... на запись 14 мегабайт в StringBuffer его хватает 16 всё облом...)
java.lang.OutOfMemoryError выдавать перестал... но толку мало доходит до второй строчки... съедается 1.30 гига оперативки соответственно уже с диска тоже... и всё диск трещит неумолимо минут 10 ждал пришлось завершить процесс..((... с чем это связанно?? т.е. есть шанс что через час что-то изменится?? или это уже без вариантов будет висеть?

Автор: tux 20.2.2007, 13:28
Цитата(tmp13 @  20.2.2007,  13:09 Найти цитируемый пост)
т.е. есть шанс что через час что-то изменится?? или это уже без вариантов будет висеть?

Наверное есть если операционка прочихается. 

А для чего нужен такой большой буфер? С точки зрения разработки выделение такого размера памяти в корне неправильно в большинстве случаев. 

Автор: Tony 20.2.2007, 13:30
Увели4ение памяти это не решение проблеми. Всего лишь кастыль. Нужно данные подгружать по кускам. Как это реализовать это другой вопрос.

Автор: tmp13 20.2.2007, 13:33
дело в том что с инета скачивается файл в формате zip потом раззиповывается следующим образом:
Код

        ZipInputStream zis = new ZipInputStream(urlCon.getInputStream());
        byte[] buffer = new byte[512];
        while(zis.available()>0)
        {
         zis.getNextEntry();
         StringBuffer isbuf=new StringBuffer();
         int minimumCapacity = 28000000;
         isbuf.ensureCapacity(minimumCapacity);
         MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();
         System.out.println(memorymbean.getHeapMemoryUsage());
         System.out.println(memorymbean.getNonHeapMemoryUsage());
         int lenzip;
         while ((lenzip = zis.read(buffer))!=-1) {
           isbuf.append(new String(buffer, 0,lenzip));
         }
         zis.closeEntry();
         zis.close();



и всё это дело должно происходить в памяти:\

по кускам... нет даже не знаю как это реализовать в данном случае...((

Автор: tux 20.2.2007, 13:42
Цитата(tmp13 @  20.2.2007,  13:33 Найти цитируемый пост)
и всё это дело должно происходить в памяти:\

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

Автор: tmp13 20.2.2007, 13:45
потому что всё это дело вполне может быть будет крутиться на разных OracleAS конечно думаю можно для каждой системы свой путь... а какие ещё способы есть?)

Автор: Tony 20.2.2007, 13:47
Код

по кускам... нет даже не знаю как это реализовать в данном случае...((

Как я понимаю ты распоковываешь zip в катором текстовые файлы и их содержимое грузишь в StringBuffer.
Надо по кускам показывать ползователю. Он двинул scrollbar  вниз или вверх данные загрузились,НО НЕ ВСЁ СРАЗУ!!!!!!. Это тоже самое 4то копировать файлы загрузив сразу в массив байтов равний размеру файла. :\ 

Автор: tmp13 20.2.2007, 13:49
нет в zip файле содержится один dbf файл который как это сказать парсится DBFReadrом и посторчно инсертится в базу!

Автор: tux 20.2.2007, 13:55
Цитата(tmp13 @  20.2.2007,  13:49 Найти цитируемый пост)
нет в zip файле содержится один dbf файл который как это сказать парсится DBFReadrом и посторчно инсертится в базу! 

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

Автор: tmp13 20.2.2007, 13:58
ну когда был такой впрос мне сказали что если бы всё было в памяти было бы круто) но видимо не покатит) ладно спасибу перепишу со скидываение на диск) thnx all)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)