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

96

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

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

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

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

  4. 是否存在管理n个JVM实例的进程或由操作系统自己管理?

  5. 在GC期间发生“停止-the-world”情况时,其他JVM实例(不同的线程)是否受到影响?


2
你的第一个观点取决于容器的实现方式... - MadProgrammer
7
把英语翻译成中文。只返回已翻译的文本:+1表示对问题进行了详细解释和研究后提出了问题。 - amod
2个回答

94

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

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

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

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

每个JVM都是一个单独的进程,这意味着没有堆栈、堆等资源共享。 (通常,唯一可能共享的是保存核心JVM和本机库代码的只读段...就像普通进程可能会共享代码段一样。)

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

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

参考: https://dev59.com/1G445IYBdhLWcg3w3Nsf#4667635

在实践中,最好直接指定堆大小。

4) 是否有任何进程管理n个JVM实例,还是由操作系统自己管理?

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

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

会受到影响。在停止整个Java虚拟机的情况下,所有Java线程都将停止执行,包括其他JVM实例中的线程。

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

10
  1. 查看如何将Java程序守护进程化?
  2. JVM的新实例将会被创建
  3. 与所有其他进程共享内存的方式相同
  4. 由操作系统(O/S)管理
  5. 其他实例不受影响

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接