Загрузка ImageIcon становится все медленнее и медленнее

#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.