Многно картинок & OutOfMemoryError
От: korostoff Россия  
Дата: 29.09.03 12:22
Оценка:
Hi, all!

Может кто подскажет...

При создании списка ImageIcon'ов из 500 картинок JPG (по 10kb каждая) появляется
ошибка OutOfMemoryError (процесс распухает до 50 метров в памяти)...

Понимаю, что с числом картинок я перегнул (тестировал) По идее в любом случае если не хватает ОП
программа должна использовать swap...

Еще интереснее, что с 500 gif-картинками такого не происходит...

Из за чего так происходит?

win2000, sun jdk1.4.2
Re: Многно картинок & OutOfMemoryError
От: Cider Россия  
Дата: 29.09.03 12:29
Оценка:
Здравствуйте, korostoff, Вы писали:

K>Из за чего так происходит?


Тут еще дело в том, что в памяти картинка хранится как битмап — 4 байта на пиксель без сжатия, так что одна картинка весом 10 кб, но размером 10000х10000 пикселей может убить ява-машину.

Cider
Cider
Re: Многно картинок & OutOfMemoryError
От: Blazkowicz Россия  
Дата: 29.09.03 12:37
Оценка: 16 (2)
Здравствуйте, korostoff, Вы писали:

K>Понимаю, что с числом картинок я перегнул (тестировал) По идее в любом случае если не хватает ОП

K>программа должна использовать swap...

Программа никому ничего не должна.

Если тебе нужно чтобы JVM использовала больше памяти, посмотри опции.

-Xms196m -Xmx256m

K>Еще интереснее, что с 500 gif-картинками такого не происходит.

K>Из за чего так происходит?

Наверняка JPEG декодеру требуется больше памяти, чем GIF декодеру.
Поэтому при интенсивном создании большого количества объектов JVM и валится.

Если в твоей программе это штатная ситуация, то посмотри в сторону WeakReference,
и проверяй размер свободной памяти

Runtime.getRuntime().freeMemory()


Если памяти остаётся мало можно приостановить процесс и позвать GC.
Re[2]: Многно картинок & OutOfMemoryError
От: Cider Россия  
Дата: 29.09.03 12:41
Оценка: 1 (1)
Здравствуйте, Blazkowicz, Вы писали:

B>Если памяти остаётся мало можно приостановить процесс и позвать GC.


Вот это как раз вряд ли поможет — система обязана сама вызвать мусорщика перед тем, как бросить OutOfMemory.

Cider
Cider
Re[3]: Многно картинок & OutOfMemoryError
От: Blazkowicz Россия  
Дата: 29.09.03 12:48
Оценка:
Здравствуйте, Cider, Вы писали:

B>>Если памяти остаётся мало можно приостановить процесс и позвать GC.


C>Вот это как раз вряд ли поможет — система обязана сама вызвать мусорщика перед тем, как бросить OutOfMemory.


C этим никто не спорит. Но если производить самостоятельнай контроль за памятью, то лучше не дожидаться системы.
Re: Многно картинок & OutOfMemoryError
От: Karimchik  
Дата: 29.09.03 14:17
Оценка: 5 (2)
Здравствуйте, korostoff, Вы писали:

K>Hi, all!


K>Может кто подскажет...


K>При создании списка ImageIcon'ов из 500 картинок JPG (по 10kb каждая) появляется

K>ошибка OutOfMemoryError (процесс распухает до 50 метров в памяти)...

K>Понимаю, что с числом картинок я перегнул (тестировал) По идее в любом случае если не хватает ОП

K>программа должна использовать swap...

K>Еще интереснее, что с 500 gif-картинками такого не происходит...


K>Из за чего так происходит?


K>win2000, sun jdk1.4.2


JPEG decoder в ява нативный. Сомневаюсь, что там есть memory leaks, но при создании, например, кучи ImageIcon из jpeg-ов из-за нативной природы JPEG Decoder-а JVM не может вовремя определить момент, когда нужно запустить GC (и/или выделить дополнительную память), т.е. создаваемые JPEG Decoder структуры с т.з. JVM имеют меньший размер, чем на самом деле. Вот и получается, что JVM думает, что память есть, а ее уже нет.
Правда это только мое ИМХО.
Re[2]: Многно картинок & OutOfMemoryError
От: mselez  
Дата: 29.09.03 16:25
Оценка:
Здравствуйте, Blazkowicz, Вы писали:


B>Если тебе нужно чтобы JVM использовала больше памяти, посмотри опции.


B>-Xms196m -Xmx256m


Почему 196, есть какое-то ограничение или это просто пример? Спасибо.
Re: Многно картинок & OutOfMemoryError
От: CMEX_ Россия  
Дата: 29.09.03 23:42
Оценка:
Здравствуйте, korostoff, Вы писали:

K>Hi, all!

K>Еще интереснее, что с 500 gif-картинками такого не происходит...
K>Из за чего так происходит?
Не самый хороший совет конечно, но попробуй прогнать свою прогу на JProfiler. Может на ней что-нибудь увидишь...
______________________
Андрей Панов
Re[3]: Многно картинок & OutOfMemoryError
От: Blazkowicz Россия  
Дата: 30.09.03 07:27
Оценка:
Здравствуйте, mselez, Вы писали:

M>Здравствуйте, Blazkowicz, Вы писали:



B>>Если тебе нужно чтобы JVM использовала больше памяти, посмотри опции.


B>>-Xms196m -Xmx256m


M>Почему 196, есть какое-то ограничение или это просто пример? Спасибо.


Просто пример. Я себе в Идее такие параметры прописал, чтобы она не стопорилась от частого GC и увеличения хипа.
196m — это 196 мегабайт, можно задавать в килобайтах и байтах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.