2013-08-23 128 views
65

每个Java应用程序都将运行在特定的Java虚拟机实例中。我真的很困惑以下几个方面,谷歌搜索引起了我更多的困惑。不同的网站上的不同文章。当多个Java程序在同一台机器上运行时

  1. 如果我已经用Java编写的Web服务,它需要一个JVM实例run.So可以JVM中做了一个守护进程?

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

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

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

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

+2

您的第一点取决于容器的执行情况...... – MadProgrammer

+3

+1请先详细解释和研究问题。 – amod

回答

58

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

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

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

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

每个JVM是一个独立的进程,这意味着没有共享堆栈,堆等等。 (通常,唯一可共享的是只读段,它们保存核心JVM和本机库的代码......与正常进程可能共享代码段的方式相同。)

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

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

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

在实践中,你可能会更好过直接指定堆大小。

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

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

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

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

+0

感谢您的信息 – Madhuri

6
  1. 看到How to Daemonize a Java Program?
  2. JVM的
  3. 新实例将被创建
  4. 相同的方式,存储器被所有其它进程之间共享
  5. 它被O管理/ S
  6. 其他实例不受影响

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

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

相关问题