графический интерфейс Java не отвечает в течение нескольких секунд - PullRequest
2 голосов
/ 26 апреля 2011

у нас есть клиент-серверное приложение java, графический интерфейс которого регулярно (каждые полчаса) перестает отвечать на запросы в среднем от 2 до 10 секунд.нажатия на разные кнопки вступают в силу только после нескольких секунд зависания.

Сначала я подумал, что существует проблема с сборкой мусора, но расследование показало, что с этой стороны все в порядке.

Я большеубежден, что это проблема с многопоточностью, поскольку графические потоки иногда блокируются.

как я могу проверить состояние графического потока, чтобы засвидетельствовать его "неотзывчивость" в моем журнале?Я представляю, что могу проверять его состояние каждую секунду или около того из другого потока, но как это сделать?какую переменную нужно опросить?

есть еще идеи о том, как решить эту проблему?

спасибо

Ответы [ 3 ]

5 голосов
/ 26 апреля 2011

Вы можете выдать kill -QUIT процессу Java (и что-то эквивалентное в Windows), что приведет к тому, что все потоки сбросят свои трассировки стека в STDOUT, чтобы вы могли видеть, что происходит. Здесь также показано, какие потоки удерживают блокировки (синхронизированные блоки), а какие ожидают.

2 голосов
/ 26 апреля 2011

Чтобы получить представление о том, как долго поток пользовательского интерфейса блокируется, вы можете сделать что-то вроде:

ScheduledThreadPoolExecutor executor = ....
executor.scheduleAtFixedRate(new Runnable(){ 
   public void run() {testEventThread();}}, 5, 5, TimeUnit.SECONDS);

void testEventThread() {
   final long now = System.currentTimeMillis();
   SwingUtilities.invokeLater(new Runnable() {
       public void run() {
             System.out.println("event thread took:" + (System.currentTimeMillis()- now) + " to respond");
       }
   });

}

2 голосов
/ 26 апреля 2011

Если вы не можете воспроизвести проблему в тесте и не можете остановить производство, то нет простого ответа на ваш вопрос.

Кажется, у вас могут быть большие проблемы, которые необходимо диагностировать с помощью какого-либо инструмента профилирования. Мы используем JProbe & JProfiler и нам повезло с этим.

В худшем случае, вы можете использовать JMX, чтобы написать собственный код, который делает что-то похожее на эту ссылку. Это было очень полезно для меня в прошлом.

http://www.javamex.com/tutorials/profiling/profiling_java5_threads_methodology.shtml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...