【问题标题】:Java Application Servers and JVMJava 应用服务器和 JVM
【发布时间】:2014-02-13 00:00:49
【问题描述】:

当您将许多应用程序部署到 java 应用程序服务器时,这些应用程序是否都运行在同一个 JVM 中,即应用程序服务器启动时启动的 JVM?

您是否可以选择在单独的 JVM 中运行这些应用程序?如果是这样,您为什么要这样做?

【问题讨论】:

    标签: java jakarta-ee jvm


    【解决方案1】:

    java 应用程序服务器运行在单个 JVM 中,因此部署在 java 应用程序服务器实例下的每个应用程序都与其他所有应用程序运行在同一个 VM 中,而每个应用程序都有不同的类加载器

    【讨论】:

    • 感谢您的回复萨达姆。那么有不同的类加载器会导致问题吗?如果 app1 使用 app2 使用的类怎么办。 app2 会在 app1 这样做后尝试加载这个类吗? Tomcat 是否知道这已经加载并且不再尝试加载它?
    • 每个应用程序都有自己的共享内存上下文,由同一个应用程序访问,因此 app2 不知道 app1 中加载的类,也无权访问它
    • 对不起,有点困惑。你的意思是Tomcat管理一个共享内存上下文,每个应用程序都有自己的私有区域,因此不会发生类加载冲突?我以前听说过类加载问题,但不确定它们是如何发生的。感谢您的帮助。
    【解决方案2】:

    浏览此问题的答案..希望所有问题都能得到解答:

    Why have one JVM per application?

    【讨论】:

      【解决方案3】:

      恐怕您不能在不同的 JVM 中运行,因为应用服务器必须管理对象的生命周期。这就是 JEE 的全部意义所在。此外,这就是 JEE 声明您不应在应用程序中使用线程的原因,因为您希望容器为您处理并发问题。

      当然,在集群环境中,您可以有多个 JVM,但对于应用服务器 + 容器仍然是相同的。

      【讨论】:

        【解决方案4】:

        如果应用程序服务器未集群,则是。

        否则它可以在不同的主机和 jvm 上工作。

        【讨论】:

        • 但是,每个应用程序仍然在应用服务器的同一个 JVM 中运行,对吧?因为appserver管理webapp的一些对象生命周期。这也是 JEE 声明你不能在你的 web 应用程序中使用线程的原因,因为它可能会破坏 JEE 合同。
        • 不一定...您可以不对称地部署应用...每个节点1个应用...此机制用于jee5应用运行批处理...jee7管理批处理
        • 我想了解更多相关信息 :-) [每天学习一件事]
        • JEE7 支持 JSR 352,即应用服务器中的批处理; JEE6 支持在单个节点上工作的 Java Singleton EJB,并且能够在节点失败时进行迁移 (docs.oracle.com/javaee/6/tutorial/doc/gipvi.html); JEE5 不支持(Weblogic 支持 EJB 单例服务),我们需要一个技巧来集成在节点上以单例方式工作的 EJB 应用程序。
        • JSR 352 听起来像是 JMS 的演变
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 2011-09-16
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多