Дисплей Java Swing перестает обновляться до тех пор, пока не будет сгенерировано событие X - PullRequest
3 голосов
/ 05 февраля 2010

РЕДАКТИРОВАТЬ: дополнительная информация в конце

У меня есть (большое) приложение Java Swing, которое демонстрирует очень странное поведение. Если компьютер, на котором он работает, остается бездействующим (без мыши или клавиатуры) в течение достаточно долгого времени (колеблется от часа до пары дней), дисплей Swing иногда перестает полностью обновляться (у нас есть, среди прочего) часы, отображаемые на экране и перестающие обновляться), пока пользователь не переместит мышь. После перемещения мыши наше приложение работает нормально. (Создание и удаление окна из другого приложения также приводит к тому, что дисплей снова начинает обновляться; ввода с клавиатуры недостаточно).

Мы запускаем Sun JDK 1.6.0_07 на ядре Linux 2.6.25.14 (я думаю, что это модифицированный дистрибутив RHEL 4, но я не уверен, что это не так)) под управлением xorg-x11-server 1.1.1-48.13.e15.

В этом состоянии очередь событий AWT всегда "Runnable", и в одном из нескольких методов java2d - самый последний пример, который у меня есть:

at sun.java2d.loops.Blit.Blit (native method)
at sun.java2d.pipe.DrawImage.blitSurfaceData
at sun.java2d.pipe.DrawImage.renderImageCopy
at sun.java2d.pipe.DrawImage.copyImage
at sun.java2d.pipe.DrawImage.copyImage
at sun.java2d.pipe.ValidatePipe.copyImage
at sun.java2d.SunGraphics2D.drawImage
at sun.java2d.SunGraphics2D.drawImage
at <our code>

А трассировка стека из GDB для этого потока выглядит так:

in poll()
in XAddConnectionWatch()
in _XRead()
in _XReply()
in XSync()
in X11SD_GetRasInfo()
in Java_sun_java2d_loops_Blit_Blit
in ??

Кроме того, в нашем приложении обычно есть пара потоков, которые визуализируются в VolatileImages в фоновом режиме. Находясь в этом состоянии, эти потоки всегда работают, но застряли в вызовах, таких как:

at sun.java2d.loops.FillRect.FillRect (Native Method)
at sun.java2d.pipe.LoopPipe.fillRect
at sun.java2d.SunGraphics2D.fillRect
at sun.java2d.SunGraphics2D.clearRect
at <our code: rendering to a VolatileImage>

и трассировка стека GDB для этих потоков:

in pthread_cond_wait@@GLIBC_2.3.2
in Monitor::wait
in GC_locker::jni_lock_slow
in jni_GetPrimitiveArrayCritical
in BufImg_GetRasInfo
in Java_sun_java2d_loops_FillRect_FillRect
in ??

Кто-нибудь видел что-нибудь подобное раньше? Мы полностью ошарашены, и я даже не уверен, что делать дальше, чтобы попытаться определить проблему.

РЕДАКТИРОВАТЬ: проблема продолжается. Очередь событий AWT в основном всегда выглядит одинаково для дампов стека JStack и GDB; мы видели, как это происходило без одновременного зависания других потоков, как я описал вначале.

Спасибо!

1 Ответ

2 голосов
/ 05 февраля 2010

Извините, я не работаю ни с одним из компонентов Java2D, поэтому я не уверен, но первое, что приходит на ум, - это один из ваших фоновых потоков - рендеринг в живой контекст.

Если это так, то в очень очень редких случаях он может столкнуться с потоком AWT (ТОЛЬКО поток, которому разрешено фактически визуализировать), и если это произойдет, вы можете легко получить результаты, которые вы видите - в Факт, это именно то, что я ожидал.

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

...