容器优先
Quarkus应用程序针对低内存使用和快速启动时间进行了优化。
从一开始,Quarkus的设计就围绕着容器优先的理念。这意味着Quarkus应用程序在以下方面进行了优化,以达到低内存使用和快速启动的目的:
构建时处理
Quarkus的中心思想是在构建时做传统框架在运行时做的事情:配置解析、classpath扫描、基于classloading的功能切换,等等。
尽可能将更多的处理在构建时完成;因此,你的应用程序只包含在运行时使用的类。在传统的框架中,所有执行初始应用部署所需的类都在应用的生命周期中存在,尽管它们只被使用一次。在Quarkus中,它们甚至不会被加载到生产用的JVM中。Quarkus并没有到此为止。在构建时的处理过程中,它为你的应用程序使用的所有组件的初始化做准备。由于所有的元数据处理都已经完成,这带来了更少的内存使用和更快的启动时间。
减少反射的使用
Quarkus尽可能地避免反射,减少启动时间和内存使用。在构建时的处理过程中,扩展可以分析应用程序代码和classpath上可用的类,并以常规调用取代反射调用。通过在构建时使用生成的自定义代理,也可以防止使用动态代理。
Arc是Quarkus使用的依赖注入框架,它消除了所有的反射调用,并在构建时推断出注入图。因此,当应用程序启动时,不需要昂贵的查找,它已经完成了!
优秀的对GraalVM原生镜像支持
GraalVM原生可执行文件支持从一开始就是Quarkus设计的重要组成部分。当一个应用程序被编译成一个原生可执行文件时,它的启动速度要快得多,并且可以在比标准JVM小得多的堆中运行。原生编译器使用积极的死代码消除技术,只嵌入JVM的部分和应用程序绝对需要的类。Quarkus使构建优化的原生可执行文件变得非常容易。构建时的方法允许Quarkus在你的应用程序上收集足够的元数据,以便对编译进行微调。没有-H:+ReportUnsupportedElementsAtRuntime
标志,没有回退,没有妥协!
原生镜像预启动
在Quarkus应用程序的原生编译过程中,我们尽可能多地对框架进行预启动。这意味着产生的原生可执行文件已经运行了大部分的启动代码,并将结果序列化到可执行文件中:启动速度更快!
Kubernetes,但也包括裸金属环境
所有允许减少内存使用和提供更快的启动时间的技术,不仅在容器中是有利的。即使在裸金属环境上,它也会减少你的内存压力,而且不必等待10秒就能看到你的应用程序运行,这总是令人愉快的。
在设计Quarkus时,我们不仅关注容器,还关注将Quarkus应用程序部署到容器协调器(如Kubernetes)上。Quarkus构建时处理还会生成Kubernetes元数据,这样就可以将应用程序部署到Kubernetes上了。运行时功能(如健康检查和指标)是开箱即用的。Quarkus在构建时收集所有必需的元数据,以创建Kubernetes部署描述符并生成容器镜像。一个命令行就可以将应用程序部署到Kubernetes集群上。