92

每个 Java 应用程序都将在特定的 Java 虚拟机实例中运行。我真的对以下方面感到困惑,而谷歌搜索让我更加困惑。不同网站上的不同文章。

  1. 如果我有一个用 Java 编写的 Web 服务,它将需要一个 JVM 实例来运行。那么 JVM 可以成为一个守护进程吗?

  2. 如果是,当我们运行任何其他 java 应用程序时,它会使用这个 JVM 实例还是创建一个新实例?

  3. 任何机器中可用的主内存都是恒定的。当我们同时启动 n 个 java 进程而不提供任何初始堆大小时,堆大小如何在进程之间分布?

  4. 是否有任何进程可以管理 n 个 JVM 实例,还是由操作系统本身管理?

  5. 当 GC 期间发生 stop-the-world 时,其他 JVM 实例(我假设的不同线程)是否受到影响?

4

2 回答 2

89

1) 如果我有一个用 java 编写的 web 服务,它将需要一个 JVM 实例来运行。那么JVM可以做一个守护进程吗?

是的,它可以。如何完成取决于操作系统和 Web 服务器容器本身。

2) 如果是,当我们运行任何其他 java 应用程序时,它会使用这个 JVM 实例还是创建一个新实例?

不,每个 Java 应用程序都使用一个独立的 JVM。

每个 JVM 都是一个单独的进程,这意味着不共享堆栈、堆等。(通常,唯一可以共享的东西是只读段,其中包含核心 JVM 和本机库的代码……就像普通进程可能共享代码段一样。)

3) 任何机器中可用的主存储器都是恒定的。当我们同时启动 n 个 java 进程而不提供任何初始堆大小时,堆大小如何在进程之间分布?

如果您未指定大小,则决定堆多大的机制取决于您使用的 JVM/平台/版本,以及您使用的是“客户端”还是“服务器”模型(对于 Hotspot JVM)。启发式不考虑其他 JVM 的数量或大小。

参考: https ://stackoverflow.com/a/4667635/139985

实际上,最好直接指定堆大小。

4) 是否有任何进程管理 n 个 JVM 实例或由操作系统本身管理?

两者都不。JVM实例的数量由可以启动进程的各种事物的动作决定;例如守护程序脚本、命令脚本、用户在命令行输入命令等等。最终,如果操作系统资源耗尽,操作系统可能会拒绝启动更多进程,但 JVM 的处理方式与其他进程没有任何不同。

5)当 GC 期间发生 stop-the-world 时,其他 JVM 实例(我假设的不同线程)是否受到影响?

不,JVM 是独立的进程。它们不共享任何可变状态。垃圾收集在每个 JVM 上独立运行。

于 2013-08-23T05:12:35.597 回答
10
  1. 请参阅如何守护 Java 程序?
  2. 将创建新的 JVM 实例
  3. 与所有其他进程之间共享内存的方式相同
  4. 它由 O/S 管理
  5. 其他实例不受影响

如果您的实例必须协调它们的工作,您可以创建单个主实例来运行/停止其他实例。

您没有解释为什么需要多个 JVM 实例。可能,单实例会更好。

于 2013-08-23T04:29:26.917 回答