1) 如果我有一个用 java 编写的 web 服务,它将需要一个 JVM 实例来运行。那么JVM可以做一个守护进程吗?
是的,它可以。如何完成取决于操作系统和 Web 服务器容器本身。
2) 如果是,当我们运行任何其他 java 应用程序时,它会使用这个 JVM 实例还是创建一个新实例?
不,每个 Java 应用程序都使用一个独立的 JVM。
每个 JVM 都是一个单独的进程,这意味着不共享堆栈、堆等。(通常,唯一可以共享的东西是只读段,其中包含核心 JVM 和本机库的代码……就像普通进程可能共享代码段一样。)
3) 任何机器中可用的主存储器都是恒定的。当我们同时启动 n 个 java 进程而不提供任何初始堆大小时,堆大小如何在进程之间分布?
如果您未指定大小,则决定堆多大的机制取决于您使用的 JVM/平台/版本,以及您使用的是“客户端”还是“服务器”模型(对于 Hotspot JVM)。启发式不考虑其他 JVM 的数量或大小。
参考: https ://stackoverflow.com/a/4667635/139985
实际上,最好直接指定堆大小。
4) 是否有任何进程管理 n 个 JVM 实例或由操作系统本身管理?
两者都不。JVM实例的数量由可以启动进程的各种事物的动作决定;例如守护程序脚本、命令脚本、用户在命令行输入命令等等。最终,如果操作系统资源耗尽,操作系统可能会拒绝启动更多进程,但 JVM 的处理方式与其他进程没有任何不同。
5)当 GC 期间发生 stop-the-world 时,其他 JVM 实例(我假设的不同线程)是否受到影响?
不,JVM 是独立的进程。它们不共享任何可变状态。垃圾收集在每个 JVM 上独立运行。