springboot程序启动慢-未配置hostname的解决

 更新时间:2021年08月30日 14:47:33   作者:catcher92  
这篇文章主要介绍了springboot程序启动慢-未配置hostname的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springboot程序启动慢-未配置hostname

今天有同时反馈自己的程序在本地mac环境还正常,在生产环境上centos7启动特别慢

具体日志如下

可以看到程序在这里卡了将近2分钟时间,期间无任何日志输出。

通过jstack查看线程发现如下信息

查看源码如下

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException;

入参为hostname,于是查看机器hostname,再ping hostname发现ping不通,至此知道解决办法应该是在/etc/hosts配置一下hostname为本机ip即可解决。

配置hostname后程序正常启动了。

Spring Boot启动速度慢的原因总结

现在spring boot的架构可以说是非常流行,不会你都不好意思说你是做java的。可是它火归火,也有一些小问题需要咱们去注意。

如果是单体项目,并且在启动速度方面没有任何要求,那么请忽略。

下面进入主题,在什么情况下spring boot的项目启动会变慢呢

前提条件

启动项目的机器硬件配置不能拖后腿,否则你说项目启动慢,项目还觉得机器不行呢…

比如网络,内存大小,CPU核心数等,不要求太高,至少也要够用吧

抛开各种人为因素,例如各种连接时间较长,其他组件启动较慢导致等待…

原因一

项目中使用的无用配置太多。

例如在一个最简单的web中,你还加入了其他各种maven配置,并且将他们配置到项目中(只是比较夸张的例子,这些配置加入都不用),然后项目本身也不懂,既然你配置了,那就加载呗。一个花0.1秒,10个就1秒,100个就10秒了…以此类推,这一点就是最容易想明白的地方了。

原因二

spring boot的自动配置。

自动配置是spring boot的一个特色,但是也是它启动慢的一个弊病。没办法,通常好用功能全的东西,总会在一些地方上有缺陷。上面说到无用的配置多,这里要说的就是spring boot它自己装配的东西太多。你可以看到在spring boot的相关jar包里,都存放着spring.factories的文件,进去一看,大部分都是写了很多的类,它是实现spring boot自动装配的核心之一。但是你仔细观察会发现,其实有很多类,你可能完全不用。但有什么办法呢,不管你用不用,至少它都会给你检查一遍,这不也是花时间的地方吗?

原因三

项目精简程度不够。

现在比较流行微服务的概念,我认为它的概念核心含义即为精简,单一,并且多数需要强调启动速度的地方也多是出自微服务的项目中。一个微服务项目中,最好是在10秒以内能够启动完毕。但是多数是做不到的,原因在于项目拆分的还不够细。你说一个接口启动快,还是10个快,或是更多,答案很明显。很多项目做到了大而全,所谓大而全就是功能很多,配置很齐全,各种可以扩展配置等,全面的不行不行的,但这意味着什么,你的配置多,有用没用先不管,至少需要编译和加载的类文件都会多出很多来,你说要这样的项目能启动快,怎么能启动快呢?

解决方法

  • 检查maven中是否无用的依赖太多
  • 比较复杂,使用spring-boot-maven插件debug启动,查看该项目中,使用了哪些配置,哪些配置没用,然后在启动类中直接注明只启动使用了的类,并且删掉@SpringBootApplication注解,手动填上@Configuration和@Import注解,并在@Import注解中加上那些配置的类。
  • 更换一些配置更快的依赖。例如,你使用A数据库连接池,功能全,配置多,但速度较慢,但是其实B连接池也能满足项目需求,但是功能相对较少,所以配置也少,启动更快,你是不是需要考A和B应该选一个。
  • 拆分出更精简的项目来独自运行,大而全意味着多而不精,精而简意味着少但是精通,它们速度,不言而喻。

此次分享就到这里,欢迎大家的讨论。以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决IDEA Gradle构建报错''Cause: zip END header not found''

    解决IDEA Gradle构建报错''Cause: zip END header not found''

    这篇文章主要介绍了解决IDEA Gradle构建报错"Cause: zip END header not found"的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java动态替换properties文件中键值方式

    Java动态替换properties文件中键值方式

    这篇文章主要介绍了Java动态替换properties文件中键值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java并发编程示例(八):处理线程的非受检异常

    Java并发编程示例(八):处理线程的非受检异常

    这篇文章主要介绍了Java并发编程示例(八):处理线程的非受检异常,Java为我们提供了一种机制,专门用于处理由Thread对象抛出的非受检异常,以避免程序的退出,需要的朋友可以参考下
    2014-12-12
  • Java8新特性之深入解析日期和时间_动力节点Java学院整理

    Java8新特性之深入解析日期和时间_动力节点Java学院整理

    这篇文章主要介绍了Java8新特性之深入解析日期和时间_动力节点Java学院整理,需要的朋友可以参考下
    2017-06-06
  • logback的UNDEFINED_PROPERTY属性源码执行流程解读

    logback的UNDEFINED_PROPERTY属性源码执行流程解读

    这篇文章主要为大家介绍了logback的UNDEFINED_PROPERTY属性源码执行流程解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • SpringBoot学习之基于注解的缓存

    SpringBoot学习之基于注解的缓存

    spring boot对缓存支持非常灵活,我们可以使用默认的EhCache,也可以整合第三方的框架,只需配置即可,下面这篇文章主要给大家介绍了关于SpringBoot学习之基于注解缓存的相关资料,需要的朋友可以参考下
    2022-03-03
  • 哈希表在算法题目中的实际应用详解(Java)

    哈希表在算法题目中的实际应用详解(Java)

    散列表(Hash table,也叫哈希表)是根据关键码值(Key value)而直接进行访问的数据结构,下面这篇文章主要给大家介绍了关于哈希表在算法题目中的实际应用,文中介绍的方法是Java,需要的朋友可以参考下
    2024-03-03
  • IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse)

    IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse)

    这篇文章主要介绍了IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Nacos源码阅读方法

    Nacos源码阅读方法

    这篇文章将会带大家阅读Nacos源码以及教大家阅读源码的技巧,感兴趣的朋友跟随小编一起看看Nacos源码阅读方法
    2022-03-03
  • idea更改默认缓存位置的步骤详解

    idea更改默认缓存位置的步骤详解

    在idea使用中,会产生大量的缓存,一般默认存放在C盘里面,会加大C盘的储存负担,如果C盘足够大,可以不考虑更改idea的缓存位置,所以本文小编给如何更改idea默认缓存位置,文中通过图文结合介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论