当多个java程序在同一台机器上运行时
Posted
技术标签:
【中文标题】当多个java程序在同一台机器上运行时【英文标题】:When multiple java programs run on the same machine 【发布时间】:2013-08-26 00:24:24 【问题描述】:每个 Java 应用程序都将在特定的 Java 虚拟机实例中运行。我真的对以下方面感到困惑,而谷歌搜索让我更加困惑。不同网站上的不同文章。
如果我有一个用 java 编写的 web 服务,它将需要一个 JVM 实例来运行。那么 JVM 可以成为一个守护进程吗?
如果是,当我们运行任何其他 java 应用程序时,它会使用这个 JVM 实例还是创建一个新实例?
任何机器中可用的主内存都是不变的。当我们同时启动 n 个 java 进程而不提供任何初始堆大小时,堆大小如何在进程之间分布?
是否有进程管理n个JVM实例,还是由操作系统自己管理?
在 GC 期间发生 stop-the-world 时,其他 JVM 实例(我假设的不同线程)是否会受到影响?
【问题讨论】:
你的第一点取决于容器的实现... +1 以获得详细解释并在提问前研究问题。 【参考方案1】:1) 如果我有一个用 java 编写的 web 服务,它将需要一个 JVM 实例来运行。那么JVM可以做守护进程吗?
是的,它可以。如何完成取决于操作系统和 Web 服务器容器本身。
2) 如果是,当我们运行任何其他 java 应用程序时,它会使用这个 JVM 实例还是创建一个新实例?
没有。每个 Java 应用程序都使用一个独立的 JVM。
每个 JVM 都是一个单独的进程,这意味着没有共享堆栈、堆等。 (通常,唯一可以共享的东西是只读段,其中包含核心 JVM 和本机库的代码......就像普通进程可能共享代码段一样。)
3) 任何机器中可用的主内存都是恒定的。当我们同时启动 n 个 java 进程而不提供任何初始堆大小时,堆大小如何在进程之间分布?
如果您不指定大小,决定堆多大的机制取决于您使用的 JVM/平台/版本,以及您使用的是“客户端”还是“服务器”模型(对于 Hotspot JVM )。启发式不考虑其他 JVM 的数量或大小。
参考:https://***.com/a/4667635/139985
实际上,最好直接指定堆大小。
4) 是否有进程管理 n 个 JVM 实例或由操作系统自己管理?
两者都不是。 JVM实例的数量由可以启动进程的各种事物的动作决定;例如守护进程脚本、命令脚本、用户在命令行输入命令等。最终,如果操作系统资源耗尽,操作系统可能会拒绝启动更多进程,但 JVM 的处理方式与其他进程没有任何不同。
5) 当 GC 期间发生 stop-the-world 时,其他 JVM 实例(我假设的不同线程)是否受到影响?
没有。 JVM 是独立的进程。它们不共享任何可变状态。垃圾回收在每个 JVM 上独立运行。
【讨论】:
【参考方案2】:-
见How to Daemonize a Java Program?
将创建新的 JVM 实例
与所有其他进程共享内存的方式相同
由 O/S 管理
其他实例不受影响
如果您的实例必须协调它们的工作,您可以创建一个主实例来运行/停止其他实例。
您没有解释为什么需要多个 JVM 实例。可能,单实例会更好。
【讨论】:
以上是关于当多个java程序在同一台机器上运行时的主要内容,如果未能解决你的问题,请参考以下文章