2010-02-05 35 views
3

編輯。如果運行計算機的計算機在閒置狀態(無鼠標或鍵盤輸入)下保持足夠長的時間(在一小時左右和幾天之間變化),則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事件隊列基本上看起來一樣;我們已經看到這種情況發生,沒有其他線程同時卡住,正如我最初描述的那樣

謝謝!

+0

一個很好的地方可以看看Sun BugParade(它最近更名爲Oracleish)http://bugs.sun.com/ - 但我會先嚐試簡單地將JVM升級到最新的官方Sun發佈。 – 2010-02-05 14:38:24

+0

我沒有設法在Sun bug數據庫中找到任何可能的東西 - 這是我檢查的第一件事情之一。可悲的是,我們被鎖定在這個特定的JVM版本上,原因是我無法控制。還是)感謝你的建議。 – Sbodd 2010-02-05 14:49:39

+0

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

回答

2

對不起,我不使用任何Java2D的東西,所以我不能確定 - 但首先想到的是你的後臺線程之一是渲染到一個活動的上下文。

如果是這種情況,那麼在非常非常罕見的情況下,它可能會與AWT線程(允許實際呈現的唯一線程)發生衝突,如果發生這種情況,您可以輕鬆獲得像您所看到的結果 - 事實上,這正是我所期望的。

我可能是錯的,但即使你認爲我是,爲什麼不嘗試讓你的後臺線程真的在WorkerThread上完成任務 - 即使它把你的性能搞砸了也不會傷害它在測試期間很少。

+0

+1好建議。另請參閱http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html – trashgod 2010-02-05 18:46:33

+0

我不認爲這種情況正在發生,除非我誤解了構成「活動環境」的內容, 。來自BufferedImage.getGraphics()或VolatileImage.getGraphics()的圖形是否是一個活動的上下文? – Sbodd 2010-02-08 16:57:22

+0

我們在Swing應用程序中發現了一些問題,如果您不小心在後臺線程中執行AWT事件隊列中的某些GUI操作,則可以輕鬆鎖定GUI。首先,你可以避開它,直到它隨後被隨機鎖定。這聽起來像。至少,你應該檢查一下這條路。 http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html – 2010-02-09 16:45:42