2011-05-10 30 views
54

運行的所有Java應用程序是否都使用相同的JVM,或者「每個Java應用程序有一個JVM」是否適用? (例如,應用程序是IntelliJ IDEA,例如服務器和NetBeans)每個Java應用程序是否有一個JVM?

此外,每個Java應用程序使用的JVM分配和進程之間是否存在任何連接?

回答

12

每個Java應用程序都有一個JVM。它們之間不應該有任何聯繫,除非你建立一個,例如與網絡。如果您正在使用IDE,則您編寫的代碼通常運行在單獨的JVM中。 IDE通常會連接單獨的JVM進行調試。如果您正在處理多個Web應用程序,那麼如果將它們部署到同一個Web容器,它們可以共享相同的JVM。

6

運行的JVM數量是調用的可執行文件的數量。 每個這樣的應用程序都會調用它自己的java可執行文件(用於windows的java.exe/javaw.exe etx),這意味着每個應用程序都在單獨的JVM中運行。

52

一般來說,每個應用程序都將獲得自己的JVM實例和自己的OS級進程,並且每個JVM實例是相互獨立的。

有一些實現細節,如Class Data Sharing,其中多個JVM實例可能會共享某些數據/內存,但這些應用程序對應用程序沒有用戶可見的影響(希望有更好的啓動時間除外)。

但是,常見的場景是運行多個Web應用程序的Glassfish或Tomcat等單個應用程序服務器(或「Web服務器」)。在這種情況下,多個Web應用程序可以共享一個JVM。

4

任何具有共享庫的應用程序將共享這些庫的相同副本。 Java有相當多的共享庫。但是,除了保存的內存之外,您不會注意到其中的差異。

6

理論上,您可以在JVM中運行多個應用程序。在實踐中,他們可以通過各種方式互相干擾。例如:

The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications. 
Any application that calls System.exit() kills all applications. 
If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too. 

Refrence

1

小末然而在這裏這個信息可能是爲別人有用。在Linux系統中,如果你想知道有多少JVM上運行,你可以試試這個命令

$ ps -ef | grep "[j]ava" | wc -l 

ps列出的過程,grep搜索含有「Java」的過程,並wc計算行返回

1

簡短回答:經常,是的,每個JVM都會得到一個應用程序。 長的答案:JVM可以這樣使用,這可能是最好的選擇,但它不一定是。

這一切都取決於你認爲是一個'應用程序'。 IDE是應用程序的一個很好的例子,它作爲一個單獨的實體呈現給它的最終用戶(即我們),但實際上由多個底層應用程序組成(編譯器,測試運行器,靜態分析工具,打包器,包管理器,項目/依賴管理工具等)。在這種情況下,IDE會使用各種技巧來確保用戶體驗到集成體驗,同時也可以屏蔽(從某種程度上)底層工具的個人變化。一個這樣的技巧是在單獨的JVM中執行一些一些事情,通過文本文件或通過應用程序級調試工具進行通信。應用程序服務器(Wildfly,Glassfish,Websphere,Weblogic等)是其存在的理由是充當其他應用程序運行的容器的應用程序。在這種情況下,從一個角度來看,每個應用程序只有一個JVM (例如,一個JVM用於運行整個應用程序服務器),但實際上在該JVM中實際上包含多個應用程序,每個應用程序在其自己的類加載器中彼此邏輯分離(減少意外進程內串擾的可能性)。

所以,這一切都取決於你認爲application是什麼。如果您純粹是在談論「在調用main()'時運行的東西」,那麼您正在爲每個JVM尋找一個應用程序 - 當OS啓動JVM時,JVM運行一個類的public static void main()方法。

但是,一旦你的應用程序開始變得越來越複雜,你的界限變得更加模糊。諸如Intellij或Eclipse之類的IDE將重複使用與'javac'相同的東西,不管是在同一個JVM中,還是在不同的JVM中,以及執行不同的工作(例如重新繪製屏幕)。 (共享JVM)應用程序服務器上的Web應用程序的用戶實際上可能使用與通過命令行本地使用的內核應用程序相同的「內核」應用程序。

相關問題