Skip to content

性能优化-加速应用启动

About 1569 wordsAbout 5 min

性能新书

2026-08-21

5.12 加速应用启动

绝大多数开发人员早就被业务系统重启慢这个问题折磨过,想象你开发时候的微调代码,部署后重启需要1分钟或者数分钟才能验证,恐怕这时候你会去看看手机新闻或者和和同事聊会天,等待系统启动完毕,因此耽误开发时间和打断工作节奏。

运维大规模部署这种系统,也会延长部署时间,尤其云原生应用,频繁创建和销毁应用,希望业务系统功能尽快启动,尽快平稳提供服务。下图展示了一个应用启动的过程,从启动到能提供高并发服务,需要一系列过程

过程描述
Java命令通过Java命令创建JVM,此时调用的是本地so或者dill文件
JVM初始化申请堆空间,初始化垃圾回收器,JIT等。
类加载加载Bootstrap ClassLoader,启动JDK核心类,然后启动应用程序的ClassLoader,加载应用程序的类,第三方类等
JIT优化分阶段优化应用。C1编译器把字节码转化为本地机器码,后续JIT对方法调用,循环等操作计数确认重点优化方法,并使用C4实现内联等优化手段。
开发框架初始化采用的开发框架,如Spring Boot,Solon等,需要一个初始化过程,比如扫描所有类确定Web服务接口
第三方包初始化比如数据库连接池初始化,微服务框架通过API定义生成实现类等。
应用初始化应用自己初始化的过程,比如创建一个缓存,或者Netty的服务器端口监听等
高并发服务此阶段应用程序才能提高并发服务

如何加速业务系统启动和凯苏快速高并发服务,针对上图的各个阶段,有不同的解决方案,按照优先级排列,投入较小而获得最大收益:

  • 能否避免重启,比如通过配置,规则引擎来调整经常变化的业务逻辑
  • 是否能采用热加载技术来避免JVM重启,比如ClassLoader技术加载经常变化的业务模块,JVM底层的类替换技术(类重定义Redefine,类替换DECVM)
  • 审查框架,是否启动过程加载过多内容,比如Spring Boot启动时候,会扫描类路径。可以限定其扫描的特定包而不需要扫描所有包。一些轻量级框架Jfinal,Solon对启动做了专门优化,有较快的启动速度
  • 审查依赖第三方包,是否初始化较慢。比如数据库连接池,如果配置初始化连接个数较大,会影响启动。开发环境可以设置一个较小的数
  • 审查应用,是否有加载较慢的对象,比如应用中,某个缓存类需要加载所有数据。建议改成懒加载,或者只加载热数据。
  • 优化JIT,比如设置-XX:TieredStopAtLevel=1 限制JIT 消耗CPU做极致优化,使得系统能较快启动和提供服务。此比较适合需要经常重启应用,比如特定的微服务或者Serverless
  • 优化JVM,比如开启类共享。避免加载Class耗时。JDK17后使用‑XX:SharedArchiveFile
  • 观测启动后到流量稳定这段时间JVM性能,比如通过VisualVM来获得CPU采样,内存采用,找到不必要的耗时以及并发瓶颈(生产系统系统功启动后,可能有较大流量的访问)。 比如Netty启动后Netty申请较大内存块作为缓存.
  • 采用AOT技术,预先编译Java程序为二进制,避免了JVM的类加载,JIT的优化编译过程。但是采用AOT技术,其不支持动态类加载和字节码等,可能要调整应用配置和第三方包(有些第三方包不支持AOT),风险较大。除非你的应用刚开始就是按照AOT来规划的。

有些文章里提到设置JMV较小的堆内存能帮助JMV启动,这是错的,因为JVM启动时候向操作系统申请堆内存,操作系统分配的是虚拟内存,只有在使用的时候才会分配物理内存。

值得注意的是,有俩个需要关注的JVM技术,虽然还暂时未能合并到OpeneJDK(某些商业JDK已经支持),但业界已经验证其能极大提高系统启动和运行速度,他几乎一步到位使得应用能立即提高高并发访问。

  • 采用支持Leyden ,将JIT优化后的代码缓存为存档文件,当JVM再次启动时候,JIT可以直接加载使用。
  • 采用 CRaC ,类似镜像快照技术,支持保存JVM的快照,下次重启可以直接从检查点恢复。具备最快的启动和运行速度。CRaC涉及到快照保存和恢复,需要应用程序写特定的回掉函数,比如网络服务程序,在使用CRac恢复后,需要重启监听端口。

需要说明的是,OpenJDK针对JVM启动慢,预热时间长的问题,自从JDK5以来就有各种解决办法,目前看来Leyden 和 CRaC 技术是最适合的。如下是互联上的一组实验数据,一个基于Spring Boot的应用

场景启动延迟内存占用
传统单体应用3000ms+1.5GB+
CRaC基础微服务300ms300MB
Leyden+CRaC应用30ms50MB

数据来自 https://blog.csdn.net/m0_65465065/article/details/149158057

本节的建议包含较多基础知识,如下是在本书提到

术语引用章节
配置8 高可用 可配置系统
脚本引擎8 高可用 使用脚本引擎&规则引擎
热加载8 高可用章节 热部署
热数据5 数据冷热处理
TieredStopAtLevel6.3 JIT
VisualVM4.4 观察单机系统功运行
AOT5.19 AOT
JIT6.3 JIT
对象池5.2 对象池

知行合一