当多个 Java 程序在同一台计算机上运行时

2022-08-31 11:05:49

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

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

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

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

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

  5. 当停止世界在GC期间发生时,其他JVM实例(我假设的不同线程)是否受到影响?


答案 1

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 期间发生停止世界时,其他 JVM 实例(我假设的不同线程)是否受到影响?

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


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

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

您没有解释为什么需要多个 JVM 实例。也许,单个实例会更好地工作。


推荐