缓慢的Java启动问题在Java社区中是臭名昭著的。启动和预热缓慢的影响是由我们使用的复杂框架和运行时的动态特性造成的。
从技术上讲,Java应用程序启动和预热包括几个连续的过程:JVM启动、应用程序启动和JVM预热。在这些过程中,JVM获得了额外的时间来提供应用程序的最高性能。
JVM利用预热阶段来编译和优化代码。代码解释和优化需要这个过程,在大型复杂应用程序的情况下,这个过程比启动过程持续的时间长得多,最多需要几分钟。
每次启动程序时,这些过程都是从头开始的。实际上,这意味着我们要花时间运行应用程序,并使用大量的CPU和内存资源来确保它在启动点的性能。因此,缓慢的启动和预热会导致在准备应用程序运行的阶段花费额外的资源,而不是其操作可能需要的资源。
因此,由于启动和预热缓慢,你会增加云成本和资源利用率。
有几种方法可以解决这个问题。
Native Image:能够减少Java应用程序的启动时间。它使用一种不同的AOT编译器,这种编译器通常能提供更好的性能。Native Image使用“封闭世界假设”方法,根据定义,它的编译器删除了预热阶段。Native Image包含代码和数据,它们是通过运行用户定义的静态初始化程序创建的预初始化堆。本Native Image快照机制只记录核心库类和用户定义的静态初始化代码。这种方法的特别优势是允许本机映像保持相同的部署大小。在规划Native Image实现时,应参考本机映像兼容性指南,以确保它适用于你的特定应用程序,因为并非所有Java应用程序都可以利用这种方法。
Project Leyden:它的主要目标是“改善Java程序的启动时间、达到性能峰值的时间和占用空间。”这个项目仍然需要完成,我们还无法评估适应的效果和可能的困难。然而,在所有项目中,Project Leyden旨在解决启动缓慢的问题,我们对结果抱有很大的期望。
在检查点进行协调恢复(CRaC):是一个完全专注于Java启动增强的OpenJDK项目。该项目的主要目标是开发一个新的标准机制无关的API来通知Java程序有关检查点和恢复事件的信息。检查点协调恢复(CRaC)提供检查点/恢复API机制解决方案,允许在任意时间点创建正在运行的应用程序的映像(“检查点”),然后从检查点文件启动映像(快照)。CRaC快照(“检查点”)包括热点进程在特定时间点的整个状态。然后,应用程序的状态恢复到创建检查点的位置,并继续执行。此外,将CRaC特性与Java runtime结合使用还提供了分发大量快照副本的选项,这对于在多个实例上部署尤其重要。不过,使用CRaC来减少应用程序需要对CI/CD环境进行一些修改,并且最佳选择检查点时间可能并不容易。
Amazon Lambda:基于CRaC技术的独立产品。Lambda在高可用性计算基础架构上运行你的代码,并执行所有计算资源管理,包括服务器和操作系统维护、容量供应、自动扩展和日志记录。Lambdas对于你的开发目标来说非常方便,但与JVM相比,它们也更昂贵且效率更低。
Java优化:迁移到较新的Java长期发布(LTS)版本可以稍微提高应用程序的性能,带来一些微小的变化。这种优化是一种快速的方法,可以立即使用。
当今Java生态系统的广阔性,以及Java社区提供的处理复杂工作负载中Java启动的单一问题的各种方法。选择现成的工具取决于你的应用程序需求,但是肯定有不止一种方法可以让你的Java既具有云原生特性又具有可持续性。有了能够为你的开发例程提供所有深度产品的合适的供应商,你的Java之旅就永远是完整的。