編輯。如果運行計算機的計算機在閒置狀態(無鼠標或鍵盤輸入)下保持足夠長的時間(在一小時左右和幾天之間變化),則Swing顯示器有時會停止更新(我們已經完成了其他任務,屏幕上顯示的停止更新的時鐘),直到用戶移動鼠標。一旦鼠標移動,我們的應用程序似乎正常工作。 (創建並從另一個應用程序中刪除窗口也會導致顯示器再次開始更新;鍵盤輸入似乎不足夠。)的Java Swing顯示停止更新,直到X事件產生
我們在Linux內核2.6.25.14上運行Sun的JDK 1.6.0_07(I認爲它是修改後的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 [email protected]@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事件隊列基本上看起來一樣;我們已經看到這種情況發生,沒有其他線程同時卡住,正如我最初描述的那樣
謝謝!
一個很好的地方可以看看Sun BugParade(它最近更名爲Oracleish)http://bugs.sun.com/ - 但我會先嚐試簡單地將JVM升級到最新的官方Sun發佈。 – 2010-02-05 14:38:24
我沒有設法在Sun bug數據庫中找到任何可能的東西 - 這是我檢查的第一件事情之一。可悲的是,我們被鎖定在這個特定的JVM版本上,原因是我無法控制。還是)感謝你的建議。 – Sbodd 2010-02-05 14:49:39
Sbodd,聽起來像你的問題和我的(http:// stackoverflow。com/questions/2233529/java-app-makes-screen-display-un-responsive-after-10-minutes-of-user-idle-time)可能是由相同的根問題引起的。不幸的是,我還沒能找到解決方案。 – Ross 2010-11-23 05:08:49