Java Swing显示停止更新,直到生成X事件

时间:2010-02-05 14:36:34

标签: java linux swing x11

编辑:最后的其他信息

我有一个(大型)Java Swing应用程序,它展示了一些非常奇怪的行为。如果运行它的计算机空闲(没有鼠标或键盘输入)足够长的时间(在一个小时左右和几天之间变化),Swing显示有时会完全停止更新(我们已经得到了,除其他外,屏幕上显示的停止更新的时钟,直到用户移动鼠标。鼠标移动后,我们的应用程序似乎正常运行。 (从另一个应用程序创建和删除窗口也会导致显示再次开始更新;键盘输入似乎不够。)

我们在Linux内核2.6.25.14上运行Sun的JDK 1.6.0_07(我认为这是一个经过修改的RHEL 4发行版,但我不确定是否正在运行)运行xorg-x11-server 1.1.1-48.13.e15。

当处于这种状态时,AWT事件队列总是“可运行”,并且在一些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。处于此状态时,这些线程始终是RUNNABLE,但卡在以下调用中:

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 ??

以前有人见过这样的事吗?我们完全难过了,我甚至不确定接下来要做什么来解决这个问题。

编辑:问题仍在继续。在JStack和gdb堆栈转储上,AWT事件队列基本上看起来都是一样的;我们已经看到这种情况发生,没有其他线程像我最初描述的那样同时被卡住了。

谢谢!

1 个答案:

答案 0 :(得分:2)

抱歉,我不使用任何Java2D的东西,所以我不能确定 - 但首先想到的是你的一个后台线程渲染到实时上下文。

如果是这种情况,那么在非常罕见的情况下,它可能会与AWT线程(允许实际渲染的唯一线程)发生冲突,如果发生这种情况,您可以很容易地得到您所看到的结果 - 事实上,这正是我所期待的。

我可能是错的,但即使你认为我是,为什么不尝试让你的后台线程实际上在WorkerThread上执行他们的任务 - 即使它稍微搞砸了你的表现也不会受到影响在测试期间。