首页 > 自考资讯 > 自考知识

spring boot启动很慢,springboot启动做了什么

头条共创 2024-07-04

作者:唐友华来源:http://www.importnew.com/30647.html 《春天有多早?》

这是2018 年Spring One 平台会议。看完会议视频后,我决定自己尝试一下。以下是我所做的测试的结果。

我推荐还没看过视频的朋友看一下,因为它很有趣。

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

本文使用的代码

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

我正在使用OpenJDK11。

java --versionopenjdk 11.0.1 2018-10-16OpenJDK 运行时环境18.9 (Build 11.0.1+13)OpenJDK 64-bit Server VM 18.9 (Build 11.0.1+13, Mixed Mode) 运行基准测试如下即可。运行可能需要一些时间。所有测试均在下面进行。

./mvnw clean package(cd benchmarks/; java -jar target/benchmarks.jar)

1. FluxBaseline

我使用SpringInitializr 创建了一个仅包含Reactive Web 的项目。接下来,创建一个WebMVC 风格的最小控制器。

d4cd1933f5ce478a9d86fbaa14573a74~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720712597&x-signature=6%2FKSNJIotDQBJsk0nXpsfRpad9I%3D 然后使用这个结果作为你的基线。让我们从这里开始吧。

2. WebMVC

我想知道为什么我应该使用WebMVC而不是WebFlux?难道只是为了比较Tomcat和Netty吗?

0853f310ac8c4ffcbd6ae6f2d6b8c12b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720712597&x-signature=CMDQzBJjwHdmq0cHCm1Py8egsoc%3DWebFlux 更快一些。

3. spring-context-indexer

接下来,我尝试了spring-context-indexer,它似乎索引了该组件。

dd43cdb0b4d64464b59dc21c06d1ca60~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720712597&x-signature=KkvVomb2k3v46UeSRJlse1FQ0uc%3D

4. 惰性初始化

尝试进行延迟初始化。

19ef37f5e7e241ad8b866b1617626989~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720712597&x-signature=%2BMsCxfcpNwAJJONSnxhsH6WW56c%3D 启动速度稍快一些。我不知道为什么会这样。稍后我将不得不进一步研究它。

使用

6. TieredStopAtLevel

-XX:TieredStopAtLevel=1 选项运行。

e261438f3dc3464283cd9ff4cc1f7c1d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720712597&x-signature=t6TyLpUQ7G3dag1X%2Fcd5OdEtsI0%3D 是的,快得多。这将节省大约2 秒。我还是不明白这个参数是什么意思。稍后您将需要了解更多信息。

使用

7. 指定 SpringConfigLocation 参数

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

基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case07_WithSpringConfigLocationOption ss 10 3.026 0.139 s/op 好吧,又慢了。

使用

8. 关闭 JMX

-Dspring.jmx.enabled=false 选项运行。

基准模式Cnt 分数误差单位MyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case08_WithJmxDisabledOption ss 10 2.877 0.097 s/op 稍快一些。

9. 取消 Logback

这里开始减少函数库。启动和取消logback。

依赖项groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId 排除排除artifactIdspring-boot-starter-logging/artifactId groupIdorg.springframework.boot/groupId /exclusion /exclusions/dependency 依赖项groupIdorg.slf4j/groupId artifactIdslf4j 这里有-jdk14/artifactId/dependencies 的结果:

基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case09_WithoutLogback ss 10 2.904 0.096 s/op 嗯.似乎有所改善?

10. 取消 Jackson

下一个是杰克逊。

依赖项groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId Exclusion 排除artifactIdspring-boot-starter-json/artifactId groupIdorg.springframework.boot/groupId /exclusion /exclusions/dependency 结果为:

基准模式Cnt 分数误差单位MyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case10_WithoutJackson ss 10 2.789 0.093 s/op 结果稍快一些。

11. 取消 HibernateValidator

依赖groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId排除排除artifactIdhibernate-validator/artifactId groupIdorg.hibernate.validator/groupId /exclusion /exclusions/dependency 结果是:

基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case11_WithoutHibernateValidator ss 10 2.857 0.084 s/op 也有一些影响。

至此,函数库就不再被取消了。

12. AppCDS

AppCDS(应用程序类数据共享)是Oracle JDK 企业版的一项功能。 OpenJDK 10 开始包含此功能。

AppCDS转储信息似乎保存在共享zip文件中,这减少了启动时间。

Benchmark Mode Cnt Score Error UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case12_WithAppCds ss 10 2.957 0.079 s/op 嗯.它没有变得更快.所以我阅读了有关CDS 的相关文章并找出了原因。

SpringBoot FatJAR 不受CDS 的控制。

13. 使用 Thin Launcher 的 Flux

抱歉,“爆炸”基准不正确。我尝试使用FatJAR,但CDS 不允许我这样做。所以,我改用Thin Launcher,于是“Exploded”就变成了“Thin Launche”。

在使用CDS之前,请先测试一下使用Thin Launcher打包JAR文件的启动速度。

插件插件groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId 依赖项依赖项groupIdorg.springframework.boot.experimental/groupId artifactIdspring-boot-thin-layout/artifactId version1.0.15.RELEASE/version/dependency/dependency/插件/插件我使用Thin Launcher 来打包我的应用程序,但我不使用Thin Launcher 启动类,而是使用Main 类来使启动尽可能快。

基准模式Cnt 得分误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case13_Exploded ss 10 2.476 0.091 s/op 嗯,速度有点快,对吧?

14. Thin Launcher + CDS

接下来,使用AppCDS。

基准模式Cnt 分数误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case14_ExplodedWithAppCds ss 10 1.535 0.036 s/op 更快!

15. 所有操作都上

终于用完了所有的操作。

基准模式Cnt 分数误差UnitsMyBenchmark.case01_FluxBaseline ss 10 2.938 0.287 s/opMyBenchmark.case15_AllApplied ss 10 0.801 0.037 s/op 不到1 秒! (´)是的

更进一步

Dave 的视频提到“Functional Bean Definition”,当我尝试仅使用Spring 而不使用SpringBoot 时,我的应用程序变得更快。其中的道理还需要进一步理解。

结果:

7fb54013c7f94753b656e5fe91a98407~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720712597&x-signature=LLWddMWaCLdo87pARTp6rLnwkKI%3D 非常有趣。谢谢你!

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢