如何让 Spring Boot 启动的更快?

举报
G-washington 发表于 2019/11/01 15:45:18 2019/11/01
【摘要】 在 Dave 的视频中,他提到了“函数式 Bean 定义”,尝试仅使用 Spring 不用 SpringBoot,app变得更快了。其中的道理还需要进一步了解。

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

来源:http://rrd.me/ekc64

“Spring有多快?”

这是 2018 Spring One Platform 中的一场会议。看完会议视频,我自己动手试了一下。下面是我做出的测试结果。

还没有观看视频的朋友推荐看一下,非常有意思。

https://springoneplatform.io/2018/sessions/how-fast-is-spring-

本文使用的代码

https://github.com/bufferings/spring-boot-startup-mybench

我使用的是 OpenJDK 11。

image.png

可以按照下面这样运行基准测试。运行起来可能需要一些时间,下面会执行所有的测试。

image.png

1. FluxBaseline

我使用 SpringInitializr 创建项目,仅包含 Reactive Web。接下来,我会写一个 WebMVC 风格的极简controller。

image.png

Spring Boot 版本是 2.1.0.RELEASE。

image.png

启动结果 2.938 ± 0.287 s/op。

image.png


现在,以这个结果作为基线。让我们从这里开始。

2. WebMVC

我很好奇为什么要用 WebMVC 而不是 WebFlux?我尝试了一下。也许仅仅是为了比较 Tomcat 和 Netty?

image.png

WebFlux 快了一点,难道不是吗?

3. spring-context-indexer

接下来,我试了 spring-context-indexer,似乎创建了 component index。

image.png

嗯…慢了一点点?

image.png

我检查了 spring.components,发现只包含了一个组件。了解…我应该尝试更大一点的项目,这样才能看到效果。

image.png


4. 惰性初始化

尝试了惰性初始化。

image.png

查看结果,启动变快了一点。

image.png


5. NoVerify

运行加 -noverify 选项:

image.png

启动变得快了一点。不知道为什么有这个结果,稍后需要仔细了解一下。

6. TieredStopAtLevel

运行加 -XX:TieredStopAtLevel=1 选项:

image.png


嗯,快多了!减少了几乎2秒。还是不知道这个参数有什么含义,稍后需要仔细了解一下。

7. 指定 SpringConfigLocation 参数

运行加 -Dspring.config.location=classpath:/application.properties 选项:

image.png


嗯,又变慢了。

8. 关闭 JMX

运行加 -Dspring.jmx.enabled=false 选项:

image.png

变得快了一点。

9. 取消 Logback

从这里开始,我开始减少函数库。开始,取消 Logback:

image.png

结果如下:

image.png

嗯…似乎有一点点改进?

10. 取消 Jackson

接下来是 Jackson

image.png

结果如下:

image.png

结果变快了一点。

11. 取消 HibernateValidator

image.png

结果如下:

image.png

也有一点效果。

到这里为止,不再取消函数库了。

12. AppCDS

AppCDS (Application Class Data Sharing) 是 Oracle JDK 的一个企业版功能。OpenJDK 10 开始包含了这个功能。

看起来 AppCDS 转储信息存到了一个共享压缩文件,所以启动时间变短了。

image.png

嗯…并没有变快…然后我阅读了CDS的相关文章,找到原因了。

SpringBoot FatJAR 不在 CDS 管理范围内。

13. 使用 Thin Launcher 的 Flux

嗯,对不起,“Exploded” 基准测试错了。我曾经试着使用 FatJAR,但是 CDS 不能这么干。所以,我转而使用 Thin Launcher,所以 “Exploded” 就变成了 “Thin Launche”。

使用 CDS 以前,我会测试使用 Thin Launcher 打包 JAR 文件的启动速度。

image.png

尽管我使用 Thin Launcher 打包 app,但并没有使用 Thin Launcher 启动类,而是使用 Main class 让启动尽可能快一些。

image.png


嗯,快了一点,对吗?

14. Thin Launcher + CDS

现在,我要使用 AppCDS 。

image.png

喔!变得更快了!

15. 所有操作都上

最终,我把所有操作都用上。

image.png

小于1秒钟!(∩´∀`)∩耶

更进一步

在 Dave 的视频中,他提到了“函数式 Bean 定义”,尝试仅使用 Spring 不用 SpringBoot,app变得更快了。其中的道理还需要进一步了解。

结果:

image.png

真的很有意思。感谢!


本文转载自微信公众号【朱小厮的博客】

原文链接:https://mp.weixin.qq.com/s/NpHIvQPAM0fF8rNp5gkDPw

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。