Java Swing显示在生成X事件之前停止更新

Java Swing显示在生成X事件之前停止更新,java,linux,swing,x11,Java,Linux,Swing,X11,编辑:结尾处的其他信息 我有一个(大型)JavaSwing应用程序,它演示了一些非常奇怪的行为。如果运行它的计算机在足够长的时间内处于空闲状态(没有鼠标或键盘输入)(从一个小时左右到几天不等),Swing显示器有时会完全停止更新(除其他外,屏幕上会显示一个时钟停止更新),直到用户移动鼠标。移动鼠标后,我们的应用程序似乎可以正常运行。(从其他应用程序中创建和删除窗口也会导致显示器再次开始更新;键盘输入似乎不够。) 我们正在Linux内核2.6.25.14上运行Sun的JDK 1.6.007(我认为

编辑:结尾处的其他信息

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

我们正在Linux内核2.6.25.14上运行Sun的JDK 1.6.007(我认为它是一个经过修改的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>
此外,我们的应用程序通常有几个线程在后台呈现给volatileImage。在这种状态下,这些线程始终处于可运行状态,但在如下调用中卡住:

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>
以前有人见过这样的东西吗?我们完全被难住了,我甚至不知道下一步该做什么来解决这个问题

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


谢谢

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

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


我可能是错的,但即使你认为我是错的,为什么不尝试让你的后台线程在WorkerThread上实际执行它们的任务呢?尝试一下也无妨,即使它会在测试期间稍微影响你的性能

一个值得一看的好地方是Sun BugParade(它最近被重新命名为Oracleish)——但我首先会尝试将JVM升级到最新的Sun官方版本。我还没有在Sun bug数据库中找到任何可能的东西——这是我检查的第一件事。遗憾的是,由于我无法控制的原因,我们被锁定在这个特定的JVM版本中。不过,谢谢你的建议。Sbodd,听起来你的问题和我的问题()可能是由同一个根本问题引起的。不幸的是,我也没能找到解决办法。+1好建议。也请看,我认为这不会发生,除非我误解了什么构成了“生活环境”。BuffereImage.getGraphics()或VolatileImage.getGraphics()中的图形是否是实时上下文?我们在Swing应用程序中发现了一些问题,如果您在后台线程中意外地从AWT事件队列中执行一些GUI操作,您可以轻松锁定GUI。你可以一开始就摆脱它,直到后来它被随机锁定。听起来就是这样。至少,你应该在这条大街上呆一会儿。
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>
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 ??