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

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

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

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

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

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

  5. 当在 GC 期间发生 stop-the-world 时,是否会影响其他 JVM 实例(我假设是不同的线程) ?

42217 次浏览
  1. see How to Daemonize a Java Program?
  2. new instance of JVM will be created
  3. the same way as memory is shared between all other processes
  4. it is managed by O/S
  5. other instances are not affected

If your instances have to coordinate their work, you can create single main instance which would run/stop other instances.

You did not explain why you need multiple JVM instances. Probably, single instance would work better.

1) If I have a web service written in java it will need a JVM instance to run. So can JVM be made a daemon process?

Yes it can. How it is done depends on the O/S and on the web server container itself.

2) If yes when we run any other java application it will use this instance of JVM or create a new one?

No. Each Java application uses an independent JVM.

Each JVM is a separate process, and that means there is no sharing of stacks, heaps, etcetera. (Generally, the only things that might be shared are the read only segments that hold the code of the core JVM and native libraries ... in the same way that normal processes might share code segments.)

3) Main memory available in any machine is constant. When we start n java processes simultaneously without providing any initial heap size how is the heap size distributed among processes?

The mechanism for deciding how big to make the heap if you don't specify a size depends on the JVM / platform / version you are using, and whether you using the "client" or "server" model (for Hotspot JVMs). The heuristic doesn't take account of the number or size of other JVMs.

Reference: https://stackoverflow.com/a/4667635/139985

In practice, you would probably be better off specifying the heap size directly.

4) Is there any process that manages n number of JVM instances or is it managed by OS itself?

Neither. The number of JVM instances is determined by the actions of various things that can start processes; e.g. daemons scripts, command scripts, users typing commands at the command line, etcetera. Ultimately, the OS may refuse to start any more processes if it runs out of resources, but JVMs are not treated any different to other processes.

5) When stop-the-world happens during an GC are other JVM instances(different threads I assume) affected?

No. The JVMs are independent processes. They don't share any mutable state. Garbage collection operates on each JVM independently.