2009-11-12 2 views
1

У нас есть приложение для мониторинга, построенное на swt и работающее на Linux. у нас есть несколько кнопок и динамическая часть, которая изменяется, когда мы нажимаем на эти кнопки. Проблема в том, что если некоторые из них слишком быстро нажимают, процессор может достигать 100% и висит навсегда. Мы наблюдали это быстрые пики CPU только на Ubuntu Linux, где в качестве окон он работает без зуда. Мы уверены, что наше приложение перерисовывает каждый раз, когда мы нажимаем (у нас есть динамическая часть) кнопка, и это по дизайну. Проблема не только в динамической части. Одним из решений является игнорирование быстрых кликов.Ошибка производительности GUI GUI на linux

Нам интересно, можем ли мы игнорировать быстрые нажатия кнопок, чтобы избежать переполнения процессора до 100%. Если это не сработает, нам, возможно, придется перепроектировать динамическую часть, которую мы предпочитаем в качестве последней опции. предложения/комментарии очень ценятся.

ответ

0

Другим решением является увеличение памяти с -Xms512m -Xmx512m

+0

С большим количеством расследований я обнаружил, что в моем ящике Linux не хватает памяти, и я ничего не вижу в журналах. Моя память кучи находится в пределах. Поэтому теперь я подозреваю, что может произойти утечка некоторой памяти, поскольку мы используем swt. Когда я смотрел на код, один класс использует метод finalize для размещения объекта swt. Я подозреваю, что это может быть преступником. Является ли этот объект завершен gc, но оставляет ресурсы собственной памяти и вызывает утечки? – Kishore

+0

может быть ... финализация недетерминирована. Вы не должны использовать финализацию для освобождения памяти в SWT. – nanda

+0

Да. У нас есть код для освобождения встроенной памяти в методах финализации.Хотя мы не переусердствовали, но у нас есть план сделать это. – Kishore

0

Похоже, что приложение просто затормозило. Вы используете потоки?

Проверьте, действительно ли перекраска является основной причиной висячего приложения. Также проверьте, какая именно резьба используется:

Thread.currentThread() 

Если это основной поток, то что-то по своей сути ошибочно; это может быть проблемой в самой Java. Если это поток, убедитесь, что он не ждет, пока другой поток завершит синхронизацию.

+0

Спасибо. Я использовал Jconsole для мониторинга приложения и обнаружения взаимоблокировок, и я не вижу никого из них в тупике. – Kishore

0

У меня такая же проблема в Ubuntu. Но на OpenSuse это выглядит намного лучше.

Вещи, которые вы можете попробовать:

Установить анти псевдоним и расширенный вариант ГХ, как:

gc.setAntialias(SWT.OFF); 
gc.setTextAntialias(SWT.OFF); 
gc.setAdvanced(false); 

И проверить, если вы используете коммерческий графический драйвер (т.е. от NVIDIA или ATI) а не драйвер с открытым исходным кодом.

0

Try this или использовать pstack или lsstack. Когда приложение работает долго (или зависает), когда он просит вас просто взглянуть и посмотреть, что он делает.

0

У многих людей были проблемы с производительностью (т. Е. Очень высокая загрузка процессора) с приложениями SWT на Gtk + при частом обновлении виджетов. Фактическая причина кажется Gtk +.

Хотя немного устаревшее, here - все объяснение таких проблем с производительностью.

Вы можете попробовать заменить компоненты SWT на embedded Swing и проверить, все ли проблемы воспроизводимы.

Смежные вопросы