#java #image #swing #imageicon #image-loading
#java #изображение #swing #imageicon #загрузка изображения
Вопрос:
В моем приложении с графическим интерфейсом Java у меня есть некоторые компоненты, которые необходимо многократно масштабировать, и я делаю это с помощью следующего кода:
Image newImage = myimage.getScaledInstance(width, height, Image.SCALE_REPLICATE);
ImageIcon newIcon = new ImageIcon(newImage);
this.setIcon(newIcon);
this.setSize(width,height);
//increment width, height
Сначала это работает нормально, но после многих итераций (пара сотен) новый конструктор ImageIcon () занимает чрезмерно много времени (около 1 секунды), основываясь на некоторых простых проверках времени. Остальная часть кода выполняется быстро.
Почему это происходит после многих итераций и как я могу заставить его перестать замедляться по мере увеличения итераций? (Загрузка изображений в фоновом потоке не будет работать, поскольку загрузка изображений не является операцией постоянного времени).
Комментарии:
1. вы сохраняете старые изображения, чтобы их нельзя было собрать в мусор?
2. Я в это не верю, поскольку setIcon (NewIcon) должен вытеснить старый значок, который существует только внутри. Но, похоже, действительно произошла какая-то утечка памяти, потому что программа использует чрезмерный объем оперативной памяти.
Ответ №1:
Взгляните на опасности Image.getScaledInstance(). Возможно, здесь проблема не в этом, но вы не узнаете, пока не попробуете альтернативные варианты.
Комментарии:
1. 1 за интересный ресурс. Я сам использую экземпляр scale и доволен результатами, но затем я масштабирую только один раз при создании объекта., например, ImageIcon resizedIcon = new ImageIcon(oldIcon.getImage().getScaledInstance (ширина, высота, изображение. SCALE_SMOOTH));
2. В этом и заключалась проблема! Мы полностью переключились на преобразования Graphics2D, и как задержка, так и утечка памяти исчезли.
Ответ №2:
Я вспоминаю предыдущие вопросы и ответы, когда загрузка изображения приводила к проблемам с памятью. Я думаю, вам нужно придерживаться теории, что это утечка памяти:
-
Подтвердите, что это проблема, запустив JVM с включенным ведением журнала GC, и посмотрите, есть ли какая-либо корреляция между сообщениями журнала и наблюдаемым замедлением. (Для подтверждения, так или иначе, должно потребоваться около минуты.)
-
Используйте свой любимый профилировщик памяти, чтобы попытаться отследить утечку.
Комментарии:
1. как мне вести ведение журнала GC с помощью eclipse?
2. В инструменте запуска конфигураций установите «-verbose:gc» в качестве одного из аргументов JVM.