簡體   English   中英

為什么在Java EE Application Server中使用單個JVM實例?

[英]Why Single JVM instance in Java EE Application server?

我想問一下,如果我們使用java命令運行獨立的Java應用程序,則為每個應用程序創建一個帶有單獨堆等的JVM新實例。

  1. 但是,為什么在Java EE應用程序服務器中,對於部署在應用程序服務器實例上的每個Ear或war文件,只有一個JVM實例?
  2. 為什么我們為每個應用程序使用單獨的類加載器來區分應用程序而不是單獨的JVM實例?
  3. App Server是否需要單個JVM實例來管理servlet,jsp和ejb等的生命周期?

假設您已經啟動了像oracle或jboss這樣的應用程序服務器,它需要一個jvm實例,因為您已將jvm調整屬性配置到bin文件夾* .bat或* .sh文件中,並且具有最小和最大堆大小以及所有jvm調整屬性僅在應用程序服務器上。 當您部署多個war文件時,該文件部署在應用程序服務器上方,它將從服務器獲取java屬性。

但是,當您使用獨立應用程序時,在這種情況下,每個應用程序都在其自己的jvm屬性中進行了配置。

關於類加載器-它在理論上將服務器與應用程序(EAR / WAR)隔離,並使每個應用程序彼此隔離。 例如,假設服務器使用Spring 3.x,而應用程序1使用Spring4.x。 通過隔離,服務器只能看到3.x,而應用程序1只能看到4.x。

但是,如果應用程序1在其EAR / WAR中不包含Spring 4.x jar,會發生什么? 父類加載器(服務器)嘗試加載Spring,當然應該是3.x。 然后,任何依賴關系也將從服務器上下文中加載。 這實際上似乎在功能上很有效(嚇人),但您更有可能遇到MethodNotFound和ClassNotFound異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM