Создание очень больших файлов изображений с BufferedImage, странные проблемы в зависимости от компиляции и компьютера
-
12-09-2019 - |
Вопрос
Я пытаюсь создать очень большое изображение на Java следующим образом:
Буферное изображение bi = новое буферное изображение (58240, 1664, буферное изображение.ТИП_INT_RGB);
очевидно, что изображение очень большое.
Теперь проблема, с которой я столкнулся, заключается в том, что, похоже, на некоторых компьютерах она работает нормально на 100%, но на других очень медленно (и нет, это НЕ имеет НИКАКОГО отношения к спецификациям).
Мой самый крупный прорыв произошел в Eclipse, IDE отказалась фактически отображать изображение и вместо этого выдала ошибку на одном из компьютеров, которая отображает изображение очень медленно (требуется значительное количество времени для изменения размера изображения и тому подобного):
Исключение в потоке "AWT-EventQueue-0" java.lang.Ошибка OutOfMemoryError:Пространство кучи Java
Другим интересным элементом ошибки является то, что даже на компьютерах, на которых она работает медленно, я могу изменять размер окна, в котором она находится, до тех пор, пока функция paint больше не будет вызываться, затем снова сделать ее большой, и если я сделаю это "правильно", она будет работать со скоростью 100%.
Не уверен, что вообще происходит, есть идеи?
Решение
Вашему приложению не хватает памяти - если я правильно рассчитал, это изображение занимает около 280 МБ.
Программы Java имеют максимальный объем памяти, который им разрешено использовать (пространство кучи), который фиксируется при запуске JVM, и то, как устанавливается это ограничение, зависит от реализации и версий JVM.Когда у вас заканчивается память или она близка к пределу, JVM будет тратить много времени на сборку мусора, что значительно замедлит ее работу.
Возможно, единственное, что вам нужно сделать, это предоставить приложению больше места в куче;это делается с помощью -Параметр командной строки Xmx.
Другие советы
Проблема заключается в размере кучи виртуальной машины Java - ее просто недостаточно в системах, которые запустили OutOfMemoryError
.
Если проблема возникает с системами, работающими под управлением Sun JVM, можно изменить размер кучи JVM с помощью Параметры, специфичные для Sun JVM.
Начиная с Java 6 от Sun, значения по умолчанию для размера кучи определяются объемом системной памяти, но также может быть переопределен -Xms
параметр, который изменяет минимальный размер кучи, и -Xmx
это изменяет максимальный размер кучи.По умолчанию минимальный размер кучи равен 1/64 объема физической памяти, а максимальный - 1/4 объема физической памяти.