为什么每个应用程序都需要一个JVM?

13
我读到每个应用程序都在自己的JVM中运行。 为什么会这样? 为什么不让一个JVM运行2个或更多的应用程序?
我读了一个SO帖子,但那里没有得到答案。 Java应用程序是否每个都有一个独立的JVM? 我指的是通过public static void main(String [])方法启动的应用程序...
4个回答

34

我假设你谈论的是通过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,但关键的隔离功能(例如干净地终止隔离)几乎不可能实现。至少,那是/是我的观点。


6

在每个应用程序中使用一个JVM,与每个应用程序使用操作系统进程基本相同。

以下是使用每个应用程序的进程的几个原因:

  • 应用程序错误不会使其他共享同一进程的应用程序崩溃/损坏数据。
  • 系统资源计入每个进程,因此计入每个应用程序。
  • 终止进程将自动释放所有相关资源(应用程序可能无法为自己清理,因此共享进程可能会产生资源泄漏)。

一些应用程序(例如Chrome)甚至采取更进一步的措施创建多个进程以隔离不同的标签和插件。

就Java而言,有更多的原因不要共享JVM。

  • 对于大型堆空间,堆空间维护成本更高。多个较小的独立堆更易于管理。
  • 在JVM中卸载“应用程序”非常困难(即使它没有运行,也有太多微妙的原因使其保留在内存中)。
  • JVM具有许多调整选项,您可能需要针对应用程序进行定制。

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

  • 应用服务器和servlet容器(例如Tomcat)。服务器端Java规范是针对共享服务器JVM和动态加载/卸载应用程序而设计的。
  • 有一些尝试为CLI应用程序创建共享JVM实用程序(例如nailgun

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


3

用于隔离执行上下文。

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

我认为拥有单独的运行时环境也有助于 GC,因为它需要处理的引用比整个环境少。

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


好的,那么 Java 中的沙箱机制与你所说的有关吗? - Apple Grinder
@AppleGrinder 把它称为“沙盒化”听起来对我来说有点过头了。这就像在单独的操作系统进程中运行每个程序一样,我不确定我会称之为沙盒,因为它们有干扰彼此的方法,但那只是不是默认设置。 - mgarciaisaia
@desert69: 你说什么?请检查我的评论,它仅在你的回答上可见。谢谢和问候。 - Ajay Bhojak
@AjayBhojak,我觉得我不太理解你的评论。你能否澄清一下?谢谢。 - mgarciaisaia
@desert 好的。我也觉得有点困惑。 :-) 。所以我想说的是,只有一个应用程序在运行,那就是 Jboss。现在我们创建的应用程序只是单个 JVM 的一部分。如果我们想要访问这些应用程序,我们只需将其作为 JBoss(JVM)提供的服务进行访问。如果我还有遗漏的地方,请纠正我或添加一些有用的信息。谢谢和问候。 - Ajay Bhojak

1

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


1
那是网络应用程序,而不是通用应用程序。 - Stephen C
@StephenC - 在这个问题的背景下,一般应用程序和Web应用程序有何不同? - Apple Grinder
@AppleGrinder - 请看我的回答。Web应用程序是您可以通过Web浏览器进行交互的一种应用程序。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接