2011-04-18 180 views
1

如果滿足某個條件,我想退出Java進程並在完成正常運行之前釋放所有資源。我不想退出JVM,因爲我有其他的Java程序在同一時間運行。 return;是否做到了上述要求,還是有更好的方法來做到這一點?Java退出程序而不退出JVM

謝謝。

回答

2

@ aix的答案可能適合您的問題。每次運行java命令(或等效命令)時,都會得到不同的JVM實例。在一個JVM實例中調用System.exit()不會導致其他JVM實例退出。 (試一下吧!)

是可能的創建一個框架,你可以在同一個JVM中運行多個程序。事實上,當你運行一個「豆殼」時,這實際上就是你所做的。當你的「程序」是在一些應用服務器框架中運行的服務(或webapps,或者你稱之爲的任何東西)時,會發生同樣的事情。

壞消息是,如果你這樣做,沒有完全可靠的方法讓個人「程序」消失。特別是,如果程序不是設計爲合作的(例如,如果程序沒有檢查中斷),你將不得不訴諸於DEPRECATED Thread.stop()方法和朋友。而這些方法可能會對JVM和其中運行的其他程序產生不良後果。

理論上,解決這個問題的方法是使用Isolates。不幸的是,我不認爲任何主流的JVM都支持Isolates。

+0

是的,現在我只是單獨啓動它們,現在它吃了更多的RAM。在多線程系統中,你可以執行'join()',但不知道除了單獨的初創公司該怎麼做。 – Sigtran 2011-04-18 11:11:06

+0

做一個'join()'只有在「程序」合作的情況下才有效;例如定期檢查它是否被打斷。 – 2011-04-18 11:16:01

9

每個正在運行的Java應用程序都有一個JVM進程。如果您退出該應用程序,則進程的JVM將關閉。但是,這不會影響其他Java進程。

+0

我開始他們作爲服務在Debian linux下,似乎如果我'System.exit();'其中一個,其他人將退出以及...我可能必須啓動它們作爲單獨的Java程序..現在會嘗試。感謝您的快速回復。那麼,「回報」會產生什麼效果呢? – Sigtran 2011-04-18 10:48:31

3

如果其他正在同時運行的線程不是守護進程線程,則不會終止該虛擬機。其他線程將繼續運行。

雖然我完全錯過了這一點。

如果您在單獨的JVM中啓動每個程序,在其中一個調用System.exit()不會影響其他程序,它們是完全不同的進程。

如果您是通過單個腳本或其他東西來啓動它們,具體取決於它如何寫入,則可能會殺死其他進程。如果沒有關於如何啓動這些應用程序的準確信息,則完全不知道發生了什麼。

+0

是的,那是真的,謝謝。我不運行它們作爲線程,這些是單獨的程序,作爲服務@啓動啓動..他們似乎都在同一時間退出..見上文。 – Sigtran 2011-04-18 10:51:21

+0

它們是由相同的服務(另一個Java程序)啓動的 - >似乎所有的JVM都運行在同一個JVM中。只是做了一個腳本,分別啓動他們@引導,它按預期工作。謝謝您的幫助。 – Sigtran 2011-04-18 11:03:01

4

您需要了解JVM機制並澄清術語。

讓我們使用以下作爲術語的數據。

  • 線程是進程內併發處理流程的分支。

  • 進程是一個OS級別的線程。操作系統管理這些進程。通過向OS管理器發送終止信號終止進程。該信號可以由進程本身或具有適用特權的另一進程發送。

  • 在一個流程中,您可以創建流程級別的線程。進程級別的線程通常由OS的進程管理提供便利,但它們由進程啓動並由進程終止。因此,進程級線程與進程不一樣。

  • 應用程序是以各種形式合作的系統,程序和/或線程的集合。應用程序中的程序或進程可以終止而不終止整個應用程序。

在JVM術語的上下文中,程序可以是下列之一。

  • 程序按每個JVM進程運行。每個程序使用一個JVM進程,並通過提供java字節碼的類路徑並指定在類路徑中找到的主入口點來調用。當你終止一個Java程序時,運行該程序的整個jvm進程也會終止。

  • 程序按進程級別線程運行。例如,在tomcat或JEE服務器中運行的應用程序在JEE進程中作爲線程運行。 JEE進程本身就是一個使用一個JVM進程的程序。當您終止一個應用程序時,JEE進程不會終止。

您可以在java程序中啓動進程級線程。你可以編寫終止線程的代碼,但不會終止進程(除非它是進程中最後一個也是唯一運行的線程)。 JVM垃圾回收將負責釋放資源,並且在進程級別線程終止後您不需要自己釋放資源。

爲了理解,上述響應被簡化了。請閱讀OS設計和線程,以便更好地理解進程和JVM機制。

+0

是的,似乎我需要閱讀線程/服務器體系結構和操作系統設計 - 我不知道單獨啓動java程序會創建單獨的JVM ...我寧願在一個JVM中啓動它們以節省一些內存,但它是另一天的工作。猜猜當我更好地理解它們應該如何工作以及如何終止一個線程(?)而不終止所有這些程序時,我會重新連接這些特定的程序。 – Sigtran 2011-04-18 11:44:18

0

導致這些需求的一些常見用例可以通過Nailgun或Drip等工具解決。

Nailgun允許您運行似乎是多個獨立執行的命令行程序,但它們都發生在同一個JVM中。因此重複的JVM啓動時間不一定需要忍受。如果這些執行與全局狀態相互作用,那麼JVM將被及時污染,並且事情開始崩潰。

Drip將爲每次執行使用一個新的JVM,但它始終保留一個預先創建的JVM,並且準備好正確的類路徑和選項。這不是高性能,但它可以通過隔離來保證正確性。