2008-10-17 56 views
8

最近我將Swing應用程序轉換爲Webstart。這個過程非常簡單,但是我發現關閉所有窗口後,我的應用程序的JVM沒有終止。線程轉儲表明有幾個非守護線程,特別是Swing的EDT,AWT和一些websart相關的線程。我是否必須在Webstart應用程序中顯式調用System.exit()?

實際使用的策略是在創建時每個窗口遞增計數器和遞減一個,當它被關閉。默認的關閉操作是DISPOSE_ON_CLOSE。溫計數器達到零,我停止所有線程池並釋放所有JNI資源。

當我推出從一個bat文件(相同的JAR文件)的應用程序,它終止罰款時,所有的窗口都關閉了,所以我想,這個問題有事情做與Webstart的。

現在的問題:

  1. 誰能告訴我究竟是怎麼回事?爲什麼Webstart會留下殭屍JVM?
  2. 有沒有一種方法可以在不停止JVM的情況下顯式釋放Webstart資源?
  3. 我一直有這樣的調用System.exit()鼓勵不釋放你的資源,並依託OS之後進行清理(如果以後重用代碼,這可能會導致危險的意外情況)上的草率做法的意見我錯過了什麼嗎?

另請參閱followup question以檢測該應用是否已由Webstart啓動。

回答

6

由於WebStart中的錯誤,是的。 WebStart啓動一個「安全線程」,以達到與EDT交互的目的。這個SecureThread可以防止在處理所有窗口和AWT資源時所期望的Java進程的自動終止。

欲瞭解更多信息,請參閱http://www.pushing-pixels.org/?p=232

+0

謝謝,鏈接解釋了我想知道的一切。有沒有我可以投票的錯誤遊行票? (如果是,請將回復作爲對主要問題的評論發佈) – ddimitrov 2008-10-18 02:20:13

0

Webstart的啓動控制檯窗口(您可能能夠禁用)。控制檯窗口用於查看webstart進程的stdout/err以及基本的日誌/調試,但具有創建頂級AWT/Swing窗口的副作用。由於AWT/EDT僅在LAST窗口處理完畢時結束,因此控制檯窗口將阻止您的應用程序。你或許應該調用System.exit()100%確保您的應用程序退出(除非你能出示擔保一定的客戶端配置,在webstart控制檯關閉)

+0

nope。默認配置是沒有控制檯窗口。屏幕上沒有任何窗口(空白任務欄,alt + esc不會做任何事情) – ddimitrov 2008-10-17 13:30:02

1

的AWT EDT通常是罪魁禍首。幾年以來,當沒有未處理的窗戶時,它已經有了一些關閉的邏輯。然而,泄漏問題經常出現,包括AWT和Swing的實施。因此,我強烈建議在生產版本中使用System.exit(您可能希望將其留給某些測試以檢測泄漏)。

的Webstart的線程都應該是守護進程時,沒有系統的窗口(控制檯,javax.jnlp服務和其它對話框)顯示。

+0

您可以舉例說明Swing中的泄漏(即分配無法使用公共API釋放的資源)嗎? – ddimitrov 2008-10-17 13:28:08

0

考慮與JConsole的連接,並獲得一起來看看哪些JVM在做什麼。

0

我遇到與web啓動相同的問題。如果我關閉java控制檯,進程不會掛斷。 Sun提供的任何已知Bug ID?

相關問題