【问题标题】:Why Single JVM instance in Java EE Application server?为什么 Java EE 应用程序服务器中有单个 JVM 实例?
【发布时间】:2016-07-29 19:20:31
【问题描述】:
我想问的是,如果我们使用 java 命令运行一个独立的 java 应用程序,那么对于每个应用程序,一个新的 JVM 实例都会使用单独的堆等创建。
- 但是为什么在 Java EE 应用服务器中,部署在应用服务器实例上的每个 ear 或 war 文件只有一个 JVM 实例?
- 为什么我们为每个应用程序使用单独的类加载器来区分应用程序而不是单独的 JVM 实例。?
- App server 中是否需要单个 JVM 实例来管理 servlet、jsp 和 ejb 等的生命周期?
【问题讨论】:
标签:
java
jakarta-ee
web
ejb
weblogic
【解决方案1】:
假设您已经启动了像 oracle 或 jboss 这样的应用程序服务器,它需要一个 jvm 实例,因为您已将 jvm 调整属性配置到 bin 文件夹 *.bat 或 *.sh 文件中,其中包含最小和最大堆大小以及所有jvm 仅在应用程序服务器上调整属性。当您部署它部署在应用程序服务器上方的多个war文件时,它会从服务器获取java属性。
但是,当您使用独立应用程序时,在这种情况下,每个应用程序都在其自己的 jvm 属性中进行了配置。
【解决方案2】:
关于类加载器——它(理论上)将服务器与应用程序(EAR/WAR)隔离开来,并将每个应用程序彼此隔离开。例如,假设服务器使用 Spring 3.x,而应用程序 1 使用 Spring 4.x。隔离让服务器只能看到 3.x 而应用程序 1 只能看到 4.x
但是,如果应用程序 1 在其 EAR/WAR 中不包含 Spring 4.x jar 会怎样?父类加载器(服务器)尝试加载当然是 3.x 的 Spring。然后还会从服务器上下文加载任何依赖项。这实际上可能看起来在功能上有效(可怕),但更有可能您最终会遇到 MethodNotFound 和 ClassNotFound 异常。