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

时间:2013-08-23 04:10:34

标签: java jvm

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:74)

  

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上独立运行。

答案 1 :(得分:10)

  1. 请参阅How to Daemonize a Java Program?
  2. 将创建新的JVM实例
  3. 与在所有其他进程之间共享内存的方式相同
  4. 由O / S
  5. 管理
  6. 其他情况不受影响
  7. 如果您的实例必须协调他们的工作,您可以创建单个主实例来运行/停止其他实例。

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