繁体   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