美文网首页Spring BootSpringBoot精选技术分享
spring-boot 项目启动过慢问题

spring-boot 项目启动过慢问题

作者: 浮梁翁 | 来源:发表于2017-04-06 14:48 被阅读5321次

    spring-boot 项目启动过慢问题##

    问题表现

    最近手上一个基于 spring-boot 开发的系统在阿里云的 ECS 上(ubuntu 14.04)启动过程中碰到启动时间过长问题,表现如下,启动日志长时间处于一下状态:



    即系统会卡在:

    INFO  o.s.b.c.e.FilterRegistrationBean : Mapping filter: 'applicationContextIdFilter' to: [/*]
    

    这句日志上长达十分钟以上。


    分析流程如下

    1. 找出耗时较长的线程,用 jps 命令或者 top 命令。

      • 使用 top 命令能够发现占用系统资源较多的 java 进程。如下图:


      • 用 jstack 命令分析 java 进程jstack 25717,结果如下

      发现localhost-startStop-1这个线程一直处于 runnable 状态,在 google 上查询对应的关键字,发现篇文章Tomcat startup time surprises,大意是说:启动Spring Boot内嵌的Tomcat时会话创建一个安全的ID生成器,为了提供最高的安全级别,Java使用/dev/random作为随机数生成器。但是/dev/random工作方式是阻塞式的。

      上述文章也提供了解决方案,采用/dev/urandom(非阻塞式的,但是安全性会低一些)来生成随机数。


    解决方案

    根据上述文章,可以修改系统属性将Spring Boot的嵌入式Tomcat实例配置为使用/dev/urandom来生成随机来解决这个问题。具体操作如下,在.bashrc中添加如下的环境变量。

    export MAVEN_OPTS=-Djava.security.egd=file:/dev/urandom
    

    执行 source .bashrc即可。

    重新启动系统,上述问题解决


    参考文章

    相关文章

      网友评论

        本文标题:spring-boot 项目启动过慢问题

        本文链接:https://www.haomeiwen.com/subject/upkqattx.html