【发布时间】:2012-11-24 07:06:07
【问题描述】:
我了解到每个应用程序都在其自己的 JVM 中运行。为什么会这样?他们为什么不让一个 JVM 运行 2 个或更多应用程序?
我阅读了一个 SO 帖子,但无法在那里得到答案。 Is there one JVM per Java application?
我说的是通过公共静态 void main(String[]) 方法启动的应用程序...)
【问题讨论】:
我了解到每个应用程序都在其自己的 JVM 中运行。为什么会这样?他们为什么不让一个 JVM 运行 2 个或更多应用程序?
我阅读了一个 SO 帖子,但无法在那里得到答案。 Is there one JVM per Java application?
我说的是通过公共静态 void main(String[]) 方法启动的应用程序...)
【问题讨论】:
(我假设您说的是通过public static void main(String[]) 方法启动的应用程序...)
理论上,您可以在 JVM 中运行多个应用程序。在实践中,它们可以通过各种方式相互干扰。例如:
System.in/out/err、一种默认编码、一种默认语言环境、一组系统属性等等。如果一个应用程序更改了这些,则会影响所有应用程序。System.exit() 的应用程序都会有效地杀死所有应用程序。简而言之,有很多问题。人们一直在努力完成这项工作,但他们从未真正成功过。一个例子是Echidna 库,尽管该项目已经沉寂了大约 10 年。 JNode 是另一个例子,尽管他们(实际上是我们)“欺骗”了核心 Java 类(如 java.lang.System),因此每个应用程序都获得了看似独立版本的 System.in/out/err、系统属性等等1.
1 - 这(“proclets”)应该是一个临时黑客,等待使用真正的“隔离”的适当解决方案。但是隔离支持停滞不前,主要是因为 JNode 架构使用单个地址空间,没有明显的方法来分离“系统”和“用户”的东西。因此,虽然我们可以创建与隔离 API 相匹配的 API,但关键的隔离功能(如彻底杀死隔离)实际上是不可能实现的。或者至少,那是/是我的观点。
【讨论】:
拥有一个 JVM 预应用程序的原因,每个应用程序具有操作系统进程基本相同。 以下是为什么每个应用程序都有一个进程的几个原因。
Chrome 等一些应用程序甚至会进一步创建多个进程来隔离不同的选项卡和插件。
说到 Java,没有更多理由不共享 JVM。
虽然有几种情况,JVM实际上是在应用程序之间共享的:
但实际上,即使在服务器端 java 中,由于上述原因,通常最好为每个应用程序使用 JVM(或多个)。
【讨论】:
用于隔离执行上下文。
如果其中一个进程挂起、失败或安全受到威胁,其他进程不会受到影响。
我认为拥有单独的运行时也有助于 GC,因为它处理的引用比完全的要少。
另外,为什么要在一个 JVM 中运行它们?
【讨论】:
Java 应用服务器,如 JBoss,旨在在一个 JVM 中运行多个应用程序
【讨论】:
这取决于您的应用程序。
Waratek 提供 Hosting multiple Java applications within a single JVM 只需检查一下即可。
【讨论】: