Spring BootSpringBoot精选技术分享

spring-boot 项目启动过慢问题

2017-04-06  本文已影响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即可。

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


参考文章

上一篇下一篇

猜你喜欢

热点阅读