我读到每个应用程序都在其自己的 JVM 中运行。为什么会这样?他们为什么不让一个 JVM 运行 2 个或更多应用程序?
我读了一篇 SO 帖子,但在那里找不到答案。 Is there one JVM per Java application?
我说的是通过 public static void main(String[]) 方法启动的应用程序 ...)
最佳答案
(我假设您正在谈论通过 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”)应该是一个临时 hack,等待使用真正的“隔离”的适当解决方案。但是隔离支持停滞不前,主要是因为 JNode 架构使用单个地址空间,没有明显的方法来分离“系统”和“用户”的东西。因此,虽然我们可以创建与 isolate API 相匹配的 API,但关键的 isolate 功能(如彻底杀死 isolate)几乎不可能实现。或者至少,那是我的观点。
关于java - 为什么每个应用程序有一个 JVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13539132/