РЕДАКТИРОВАТЬ: дополнительная информация в конце
У меня есть (большое) приложение 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; мы видели, как это происходило без одновременного зависания других потоков, как я описал вначале.
Спасибо!