当多个Java程序在同一台机器上运行

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

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

  2. 如果是的话,当我们运行任何其他的Java应用程序,它会使用这个JVM的实例或创build一个新的?

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

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

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

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

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

2)如果是,当我们运行任何其他的Java应用程序,它会使用这个JVM的实例或创build一个新的?

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

每个JVM都是一个独立的进程,这意味着没有共享堆栈,堆等等。 (通常,可以共享的唯一的东西是只读段,它们包含核心JVM和本地库的代码……就像正常进程可能共享代码段一样。

3)任何机器的主内存都是恒定的。 当我们同时启动n个java进程而没有提供任何初始堆大小的时候,堆进程的大小是如何分布的?

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

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

实际上,直接指定堆大小可能会更好。

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

都不是。 JVM实例的数量取决于可以启动进程的各种操作; 例如守护进程脚本,命令脚本,在命令行input命令的用户等等。 最终,如果操作系统耗尽资源,操作系统可能会拒绝启动更多的进程,但JVM不会与其他进程有任何不同。

5)当一个GC期间停止世界发生其他JVM实例(我假设不同的线程)受到影响?

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

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

如果你的实例必须协调工作,你可以创build一个运行/停止其他实例的主实例。

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