【问题标题】:Why have one JVM per application?为什么每个应用程序有一个 JVM?
【发布时间】:2012-11-24 07:06:07
【问题描述】:

我了解到每个应用程序都在其自己的 JVM 中运行。为什么会这样?他们为什么不让一个 JVM 运行 2 个或更多应用程序?

我阅读了一个 SO 帖子,但无法在那里得到答案。 Is there one JVM per Java application?

我说的是通过公共静态 void main(String[]) 方法启动的应用程序...)

【问题讨论】:

    标签: java jvm


    【解决方案1】:

    (我假设您说的是通过public static void main(String[]) 方法启动的应用程序...)

    理论上,您可以在 JVM 中运行多个应用程序。在实践中,它们可以通过各种方式相互干扰。例如:

    • JVM 有一组System.in/out/err、一种默认编码、一种默认语言环境、一组系统属性等等。如果一个应用程序更改了这些,则会影响所有应用程序。
    • 任何调用System.exit() 的应用程序都会有效地杀死所有应用程序。
    • 如果一个应用程序失控,消耗过多的 CPU 或内存,也会影响其他应用程序。

    简而言之,有很多问题。人们一直在努力完成这项工作,但他们从未真正成功过。一个例子是Echidna 库,尽管该项目已经沉寂了大约 10 年。 JNode 是另一个例子,尽管他们(实际上是我们)“欺骗”了核心 Java 类(如 java.lang.System),因此每个应用程序都获得了看似独立版本的 System.in/out/err、系统属性等等1.

    1 - 这(“proclets”)应该是一个临时黑客,等待使用真正的“隔离”的适当解决方案。但是隔离支持停滞不前,主要是因为 JNode 架构使用单个地址空间,没有明显的方法来分离“系统”和“用户”的东西。因此,虽然我们可以创建与隔离 API 相匹配的 API,但关键的隔离功能(如彻底杀死隔离)实际上是不可能实现的。或者至少,那是/是我的观点。

    【讨论】:

      【解决方案2】:

      拥有一个 JVM 预应用程序的原因,每个应用程序具有操作系统进程基本相同。 以下是为什么每个应用程序都有一个进程的几个原因。

      • 应用程序错误不会关闭/损坏共享同一进程的其他应用程序中的数据。
      • 系统资源按进程计算,因此按应用计算。
      • 终止进程会自动释放所有相关资源(应用程序可能不会自行清理,因此共享进程可能会产生资源泄漏)。

      Chrome 等一些应用程序甚至会进一步创建多个进程来隔离不同的选项卡和插件。

      说到 Java,没有更多理由不共享 JVM。

      • 堆空间大时,堆空间维护损失会更高。多个较小的独立堆更易于管理。
      • 在 JVM 中卸载“应用程序”是相当困难的(有许多微妙的原因让它保留在内存中,即使它没有运行)。
      • JVM 有很多调整选项,您可能希望针对应用程序进行调整。

      虽然有几种情况,JVM实际上是在应用程序之间共享的:

      • 应用服务器和 servlet 容器(例如 Tomcat)。服务器端 Java 规范在设计时考虑了共享服务器 JVM 和动态加载/卸载应用程序。
      • 很少有人尝试为 CLI 应用程序创建共享 JVM 实用程序(例如 nailgun)

      但实际上,即使在服务器端 java 中,由于上述原因,通常最好为每个应用程序使用 JVM(或多个)。

      【讨论】:

        【解决方案3】:

        用于隔离执行上下文。

        如果其中一个进程挂起、失败或安全受到威胁,其他进程不会受到影响。

        我认为拥有单独的运行时也有助于 GC,因为它处理的引用比完全的要少。

        另外,为什么要在一个 JVM 中运行它们?

        【讨论】:

        • 好的,那么java中的沙盒与您所说的有关吗?
        • @AppleGrinder 将其称为“沙盒”对我来说听起来有点矫枉过正。在单独的操作系统进程中运行每个程序就像沙盒一样......我不确定我是否会称其为沙盒,因为它们有相互干扰的方式,但这不是默认设置。跨度>
        • @desert69:你说什么??请检查我在您的答案中可见的评论。谢谢和问候。
        • @AjayBhojak 我想我不太明白你的评论。你能澄清一下吗?谢谢
        • @desert 好的。我也发现它令人困惑。 :-) 。所以我想说的是,只有一个应用程序正在运行,它是 Jboss。现在,我们创建的应用程序只是那个单一 JVM 的一部分。现在,如果我们想访问这些应用程序,我们只需将它们作为 JBoss (JVM) 提供的服务来访问。如果我仍然在其他地方失踪,请纠正我或添加一些有用的东西。谢谢和问候。
        【解决方案4】:

        Java 应用服务器,如 JBoss,旨在在一个 JVM 中运行多个应用程序

        【讨论】:

        • 那是web应用而不是一般应用。
        • @StephenC - 一般应用程序与网络应用程序有何不同,尤其是在这个问题的上下文中?
        • @AppleGrinder - 见我的回答。 Web 应用程序是您使用 Web 浏览器与之交谈的应用程序。
        【解决方案5】:

        这取决于您的应用程序。

        Waratek 提供 Hosting multiple Java applications within a single JVM 只需检查一下即可。

        【讨论】:

          猜你喜欢
          • 2011-08-22
          • 2013-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-29
          • 1970-01-01
          相关资源
          最近更新 更多