java - 为什么每个应用程序有一个 JVM?

标签 java jvm

我读到每个应用程序都在其自己的 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 功能(如彻底杀死 is​​olate)几乎不可能实现。或者至少,那是我的观点。

关于java - 为什么每个应用程序有一个 JVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13539132/

相关文章:

java-8 - 当我在 Ubuntu 上构建 OpenJDK9 时,运行 "configure"并发现大量缺少的依赖项,这有关系吗?

java - Jmap 无法连接进行转储

java - 正则表达式模式与目录内的文件名不匹配

java - IllegalArgumentException Android 中的 SQLite 数据库绑定(bind)值索引 1 为 null

Java GUI 未显示

java - 如何在多个核心上执行java程序?

java - 用Java格式化pdf

java - 寻找JAVA之家

Java 应用程序因堆而变慢

java - jVisualVM中采样和分析的区别