Создание очень больших файлов изображений с BufferedImage, странные проблемы в зависимости от компиляции и компьютера - PullRequest
1 голос
/ 07 июня 2009

Я пытаюсь создать очень большое изображение в Java, например:

BufferedImage bi = новый BufferedImage (58240, 1664, BufferedImage.TYPE_INT_RGB);

очевидно, что изображение очень большое.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что на некоторых компьютерах она работает нормально на 100%, а на других - очень медленно (и это никак не связано со спецификациями).

Мой самый большой прорыв произошел в Eclipse, IDE отказалась отображать изображение на самом деле и вместо этого выдавала ошибку на одном из компьютеров, которая отображала изображение очень медленно (для изменения размера изображения и т. П. Требуется значительное время) :

Исключение в потоке "AWT-EventQueue-0" java.lang.OutOfMemoryError: Пространство кучи Java

Другим интересным элементом ошибки является то, что даже на компьютерах, на которых она работает медленно, я могу изменить размер окна, в котором она находится, до тех пор, пока функция рисования больше не будет вызываться, затем снова сделать его большим, и если я сделаю это «правильно», то это работает со скоростью 100%.

Не уверен, что вообще происходит, есть идеи?

Ответы [ 2 ]

7 голосов
/ 07 июня 2009

Вашему приложению не хватает памяти - если я правильно рассчитал, это изображение занимает около 280 МБ.

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

Может быть, единственное, что вам нужно сделать, это дать приложению больше пространства кучи; это делается с помощью параметра командной строки -Xmx .

2 голосов
/ 07 июня 2009

Проблема связана с размером кучи виртуальной машины Java - просто недостаточно систем, которые выдавали OutOfMemoryError.

Если проблема возникает в системах, использующих Sun JVM, можно изменить размер кучи JVM, используя специфичные для Sun JVM опции .

Начиная с Sun Java 6, значения по умолчанию для размера кучи определяются объемом системной памяти , но также могут быть переопределены параметром -Xms, который изменяет минимальный размер кучи, и -Xmx, который изменяет максимальный размер кучи. По умолчанию минимальный размер кучи составляет 1/64 объема физической памяти, а максимальный - 1/4 объема физической памяти.

...