SpringBoot程序启动速度提速分析

 传统的破程序(百万行级一个微服务),在我的P15-gen2代电脑上启动一次需要80秒左右(直接运行三次,取平均值),在其它人电脑上可想而知了。

大概记录几点

1   优化肯定是需要找工具观察的,不观测还谈什么优化, 每个人可以找不同的工具,我就用用profile工具同样可以, 

2  一些理论点

   

a     对Spring的启动过程,包括jvm的class的加载有一些了解

 b  对一堆spring-**-starter的原理有一些了解,这个跟上面一点其实是有关联的

  至少要真正分析过一个完整的源码,你就会明白为什么了。随意说一点,你翻翻,大多在加载类的时候是怎么找到自己要代理的类,比如feign.

c 对spring中的扩展点,特别是bean生命周期有一些了解。

d 对工具(不同的监测工具有不同的知识点)需要一点点了解,当然这个很简单

    需要进行分析的几个点  1 执行次数特别多的需要考虑,比如说类加载次数

                                          2 本方法比较耗时的

                                         3 本方不耗时,但是其实已经是JDK中去了,相当于第2类。同样需要分析

3 动手吧

  a  引入Indexder,加速扫描,因为代码是百万行级的,提高了几秒

 b  从中间件/组件出发

     OpenFeign发现扫描的类过多,精细到具体的包,提高了1-2秒

    RocketMQ 发现非常无语的,为些我截图了,这玩意拼命调 NetworkInterface.getNetworkInterfaces ,这个可是耗时的

  随意看两张图

   SpringBoot程序启动速度提速分析_第1张图片

就把MQ的优化一下

SpringBoot程序启动速度提速分析_第2张图片

 减少了几秒。

这个嘛,想了想,其实大多没有切入点修改(原因随意翻一下就知道,大多是工具类,没有啥好的扩展点),退而求其次的办法是做个java-agent,自动做cache.这个我就不细讲了,熟悉字节码的人玩起来很简单. 更进一步,这是为 了提高开发的效率,可以考虑在IDEA中做个插件,一键启用,开启自动cache.爽翻

c  spring的扩展点来监测bean生命周期

   这个其实比较简单,随意说一个,比如在在InitializingBean中做了太多耗时又同步的线程,启动不慢才怪。

   这里要看情况,把比较耗时的改为异步,但是要注意不要影响程序的逻辑

d   去掉有人引起来又没真正使用的一些spring-**_starter,谁叫这是祖传十来年的代码呢

最后的效果,初步估计,能提高30%的速度,还有几个点没空改。改完了没有牛人们动不动提高80%,但是估计40%是有希望的 

你可能感兴趣的:(spring,cloud,spring,java)