有 JVM 守护进程吗?

zac*_*sek 7 java daemon

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

我问的原因是因为 JVM 启动时间很慢,并且对脚本编写造成了沉重的负担。

zen*_*aan 8

JVM 启动时间很慢,并且对脚本编写造成了沉重的负担。. . java进程启动时间的巨大优化。

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

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

如果愿意牺牲用户分离的安全性,请查看Nailgun,一个非常快的 Java

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


Gil*_*il' 6

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

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

您可以编写一个作为守护进程的 Java 程序。这是您必须在逐个应用程序的基础上管理的东西。您可以让您的应用程序作为守护程序启动,并在收到新请求时进行分叉。由您决定分叉时要做什么。