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


83

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

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

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

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

  4. 是否有管理n个JVM实例的进程,或者由OS本身管理?

  5. 当GC发生世界末日时,是否会影响其他JVM实例(我认为是不同的线程)?


2
您的第一点取决于容器的实现...
MadProgrammer

6
+1进行详细说明,然后再问问题。
2013年

Answers:


80

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

是的,它可以。如何完成取决于O / S和Web服务器容器本身。

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

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

每个JVM是一个单独的进程,这意味着不会共享堆栈,堆等。(通常,唯一可以共享的内容是保存核心JVM和本机库代码的只读段,就像普通进程可以共享代码段一样。)

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

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

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

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

4)是否有管理n个JVM实例的进程,或者由OS本身管理?

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

5)当GC期间发生世界末日时,是否会影响其他JVM实例(我认为是不同的线程)?

否。JVM是独立的进程。他们没有任何可变状态。垃圾回收在每个JVM上独立运行。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.