编辑:最后的其他信息
我有一个(大型)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事件队列基本上看起来都是一样的;我们已经看到这种情况发生,没有其他线程像我最初描述的那样同时被卡住了。谢谢!
答案 0 :(得分:2)
抱歉,我不使用任何Java2D的东西,所以我不能确定 - 但首先想到的是你的一个后台线程渲染到实时上下文。
如果是这种情况,那么在非常罕见的情况下,它可能会与AWT线程(允许实际渲染的唯一线程)发生冲突,如果发生这种情况,您可以很容易地得到您所看到的结果 - 事实上,这正是我所期待的。
我可能是错的,但即使你认为我是,为什么不尝试让你的后台线程实际上在WorkerThread上执行他们的任务 - 即使它稍微搞砸了你的表现也不会受到影响在测试期间。