是否有 JVM 守护进程?

是否有 JVM 守护进程?

我很好奇,是否有一个 JVM 作为操作系统守护进程运行,并在应在其中启动新进程时分叉(即像 init 或 Android 上的 zygote 进程)?如果不是,为什么不呢?我不是在谈论 JVM 中的守护线程。

我之所以问这个问题,是因为 JVM 启动时间非常慢,并且对脚本编写造成了沉重的负担。

答案1

JVM 启动时间相当慢,并且对脚本编写造成很大影响。 。 。 java进程启动时间的巨大优化。

其他答案回答了有关通用应用程序启动的问题,这是有用的考虑因素。

但似乎您的主要问题是 Java 应用程序启动性能和启动 jvm 的开销。这也曾是我的疑问。我找到了这个:

如果愿意牺牲用户分离安全性,请查看Nailgun,一个速度极快的 Java:

Nailgun 是一个客户端、协议和服务器,用于从命令行运行 Java 程序,而不会产生 JVM 启动开销。程序在服务器中运行(用Java实现),并由客户端(用C编写)触发,客户端处理所有I/O。

答案2

Android 使用单个 Zygote 进程来分叉启动新应用程序。这种优化是可能的,因为所有 Android 应用程序都在同一环境中启动;启动应用程序几乎不需要做任何事情(主要是设置用户并加载应用程序代码)。这种优化是有效的,因为几乎没有什么可做的,特别是因为 Zygote 进程已经链接了库。

在 UNIX 系统上,Zygote 的假设并未得到满足。每个进程都以自己的环境变量、自己的打开文件、自己的使用限制、自己的用户和组等开始。您无法将所有这些属性从一个进程转移到另一个进程(您可以转移一些,但即使这样将意味着额外的启动时间)。此外,不同的应用程序使用多种不同的库;每个应用程序都必须加载自己的应用程序。类似 Zygote 的优化一般来说是不可能的,而且在许多情况下,即使有可能也没有真正的帮助。

您可以编写一个作为守护进程的 Java 程序。您必须逐个应用程序来管理它。你(们)能做到你的申请作为守护进程启动,并在收到新请求时派生。分叉时要做什么由你决定。

答案3

任何进程,包括 java 程序,都可以作为守护进程运行。真正的问题是 Java 实现是否具有所有系统调用以使其成为“适当的守护进程”(例如,信号处理、会话/进程组处理等)。您可能想看看Java 守护进程 API

另外,由于操作系统分叉将创建正在运行的程序的副本,不会有启动成本,只有在操作系统内创建新进程数据结构的成本。执行后续操作exec可能会产生启动成本。由于已经有稳定的 API,因此 Java 程序通常使用线程来代替 fork。

答案4

实际上,像 JBoss 这样的应用程序服务器提供的功能与您所要求的功能类似(但不相同):Java 进程在后台运行,您可以指示它启动子应用程序。然而,这种方法的缺点是子应用程序不是作为单独的进程启动的,因此它们不能安全地分离:如果一个虚拟机崩溃,或调用 System.exit(),或决定中断()所有线程,所有其他子应用程序也会受到影响。

相关内容