如果 JVM 使用 JIT 编译器,为什么基于 Java 的无服务器函数有冷启动?
Why Java based serverless functions have cold start if the JVM uses a JIT compiler?
周五晚上阅读 material Cloudflare 的基于 v8 的“无冷启动”Workers 功能后的想法 - 简而言之,因为 Java 的 V8 引擎的即时编译器脚本代码 - 我想知道为什么这种无冷启动类型的无服务器函数似乎只存在于 Javascript.
这是否仅仅是因为在推出 AWS Lambda / Azure Functions 时,它们在架构上被设计为一种更加简化的 Kubernetes 模型,其中每个函数都存在于自己的容器中?我认为这是一个更简单的模型,可以将不同客户的代码分开,而不是引擎盖下提供的任何魔术酱 v8 隔离。
所以给定 Java 被编译成 JVM 的字节码,它使用 JIT 编译(如果它不优化和编译成机器代码某些高使用率的函数),因此在技术上是否也可以拥有没有冷启动 Java 无服务器功能?只要有某种方法可以在调用每个客户端的字节码时在云提供商的服务器上加载它们。
要使这成为现实,实际挑战是什么?我不是这方面的大专家,但也许可以想象:
- 编译后的字节码不适合以这种方式加载 - 它应该是在 JVM 中执行的唯一代码
- JVM 优化不是为了支持加载短暂的、多个函数,而是将加载的所有代码视为一个大型程序
- JVM 启动后不支持加载额外的字节码。
原则上,您可能会开发一个以 Java 为中心的无服务器 运行time,其中各个功能按需动态加载,并且您可能能够实现相当不错的冷启动时间这样但是,有两个重要原因导致这可能不如 JavaScript:
- 虽然 Java 是为 JIT 编译而设计的,但它并没有像 V8 那样针对启动时间进行优化。今天,JVM 最常用于大型永远在线的服务器,其中启动速度并不那么重要。另一方面,V8 一直专注于在用户等待时下载和执行代码的浏览器环境,因此最小化启动延迟至关重要。 (看看替代 Java 运行time 就像 Android 的 Dalvik 可能真的很有趣,它有更多的理由优先考虑启动速度。也许它可能是一个非常快的 Java 无服务器环境!)
- 安全。 V8 和其他 JavaScript 运行times 从一开始就在设计时就考虑到了恶意代码,并且对它们进行了大量的安全研究。 Java 也试图在早期使用“小程序”来解决这个问题,但是 Java 的用法从未流行起来。如今,安全沙盒已不是 Java 的主要关注点。因此,运行 多个 Java 应用程序在同一个容器中彼此不信任可能风险太大。因此,您又要为每个应用程序启动一个单独的容器。
周五晚上阅读 material Cloudflare 的基于 v8 的“无冷启动”Workers 功能后的想法 - 简而言之,因为 Java 的 V8 引擎的即时编译器脚本代码 - 我想知道为什么这种无冷启动类型的无服务器函数似乎只存在于 Javascript.
这是否仅仅是因为在推出 AWS Lambda / Azure Functions 时,它们在架构上被设计为一种更加简化的 Kubernetes 模型,其中每个函数都存在于自己的容器中?我认为这是一个更简单的模型,可以将不同客户的代码分开,而不是引擎盖下提供的任何魔术酱 v8 隔离。
所以给定 Java 被编译成 JVM 的字节码,它使用 JIT 编译(如果它不优化和编译成机器代码某些高使用率的函数),因此在技术上是否也可以拥有没有冷启动 Java 无服务器功能?只要有某种方法可以在调用每个客户端的字节码时在云提供商的服务器上加载它们。
要使这成为现实,实际挑战是什么?我不是这方面的大专家,但也许可以想象:
- 编译后的字节码不适合以这种方式加载 - 它应该是在 JVM 中执行的唯一代码
- JVM 优化不是为了支持加载短暂的、多个函数,而是将加载的所有代码视为一个大型程序
- JVM 启动后不支持加载额外的字节码。
原则上,您可能会开发一个以 Java 为中心的无服务器 运行time,其中各个功能按需动态加载,并且您可能能够实现相当不错的冷启动时间这样但是,有两个重要原因导致这可能不如 JavaScript:
- 虽然 Java 是为 JIT 编译而设计的,但它并没有像 V8 那样针对启动时间进行优化。今天,JVM 最常用于大型永远在线的服务器,其中启动速度并不那么重要。另一方面,V8 一直专注于在用户等待时下载和执行代码的浏览器环境,因此最小化启动延迟至关重要。 (看看替代 Java 运行time 就像 Android 的 Dalvik 可能真的很有趣,它有更多的理由优先考虑启动速度。也许它可能是一个非常快的 Java 无服务器环境!)
- 安全。 V8 和其他 JavaScript 运行times 从一开始就在设计时就考虑到了恶意代码,并且对它们进行了大量的安全研究。 Java 也试图在早期使用“小程序”来解决这个问题,但是 Java 的用法从未流行起来。如今,安全沙盒已不是 Java 的主要关注点。因此,运行 多个 Java 应用程序在同一个容器中彼此不信任可能风险太大。因此,您又要为每个应用程序启动一个单独的容器。