Spring boot应用启动后首次访问很慢的解决方案

 更新时间:2021年06月23日 11:50:52   作者:Joey Zeng  
这篇文章主要介绍了Spring boot应用启动后首次访问很慢的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring boot应用在ECS服务器上启动后首次访问很慢的问题

环境:

  • CentOS7
  • JDK1.8
  • MYSQL8
  • 应用是Spring boot框架的(内嵌式tomcat)jar文件

问题描述:

通过命令:nohup java -jar XXXX.jar & 启动项目后浏览器访问响应十分的缓慢,网页图片和css等静态资源加载的十分缓慢(网站登录更是需要好几分钟才能完全加载完毕)。

然后在Google浏览器搜索了一下(已翻墙),搜索需用英文,类似问题看来不是个例呀,甚至JDK bug列表汇中就有相似的bug,如JDK-6521844 : SecureRandom hangs on Linux Systems,但这些bug都标记为fixed。但明显没有完全fix掉啊。然后继续找,原来

Avoiding JVM Delays Caused by Random Number Generation

正好记录了这个随机数生成慢的原因和解决方案。Java随机数生成依赖熵源(Entropy Source),默认的阻塞型的 /dev/random熵源可能导致阻塞,而换一个非阻塞的 /dev/urandom的熵源就可以了。

进入你的JAVA_HOME的jre目录下找到并vim编辑这个文件:

$JAVA_HOME/jre/lib/security/java.security

找到:

securerandom.source=file:/dev/random 这一行

改之前:

securerandom.source=file:/dev/random

改为:

securerandom.source=file:/dev/urandom

然后保存修改就OK了!

Spring boot静态资源访问太慢

在这里插入图片描述

产生的问题:

spring boot 启动的服务静态资源非常慢,慢到无法忍受。

排查过程 一

1. 在filter 中记录请求时间 ,得到某些静态资源居然600ms,但是主要问题不在这里,是客户端的连接被阻塞了。如上图

2. 然后然后禁用filter(直接spring boot static) 返回

3. 结果还是很慢

排查过程 二

1. 开启客户端资源 GZIP

2. 手动设置cache-contro

结果还是很慢,我就很疑惑了,难道是选用的资源有问题,看着也很正常。

于是我就把资源都放到 python flask!! 结果比java的快了好几倍。。 瞬间我人就蒙了。

然后仔细看application.xml 配置,其实当时也没设置什么东西 ,于是一项一项的注释,效率上还是没变化,我就试了试新建一个项目,然后把 html 都拿过去。

问题解决了!! 速度 非常快

好家伙,我直接好家伙,我查了几天的问题,居然可能是在依赖上。

最后结论 :应该是某一个依赖项有问题导致的,或者版本本身不对劲

有空再去看看2.3.4 的 底层tomcat配置有什么不同

有问题的配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tianlun</groupId>
    <artifactId>tianlunpc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>tianlunpc</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- session jdbc -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-jdbc</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

没问题的配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.tianlun</groupId>
    <artifactId>tianlinpc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>tianlinpc</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.tianlun.tianlunpc.TianlinpcApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis Plus插入数据后获取新数据id值的踩坑记录

    Mybatis Plus插入数据后获取新数据id值的踩坑记录

    在某些情况下,需要在执行新增后,需要获取到新增行的id,这篇文章主要给大家介绍了关于Mybatis Plus插入数据后获取新数据id值的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Java常用HASH算法总结【经典实例】

    Java常用HASH算法总结【经典实例】

    这篇文章主要介绍了Java常用HASH算法,结合实例形式总结分析了Java常用的Hash算法,包括加法hash、旋转hash、FNV算法、RS算法hash、PJW算法、ELF算法、BKDR算法、SDBM算法、DJB算法、DEK算法、AP算法等,需要的朋友可以参考下
    2017-09-09
  • Spring在多线程环境下如何确保事务一致性问题详解

    Spring在多线程环境下如何确保事务一致性问题详解

    这篇文章主要介绍了Spring在多线程环境下如何确保事务一致性问题详解,说到异步执行,很多小伙伴首先想到Spring中提供的@Async注解,但是Spring提供的异步执行任务能力并不足以解决我们当前的需求,需要的朋友可以参考下
    2023-11-11
  • Mybatis日期格式自动转换需要用到的两个注解说明

    Mybatis日期格式自动转换需要用到的两个注解说明

    这篇文章主要介绍了Mybatis日期格式自动转换需要用到的两个注解说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆红的原因解读

    Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆红的原因解读

    这篇文章主要介绍了Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆红的原因解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Spark集群框架的搭建与入门

    Spark集群框架的搭建与入门

    Spark是专为大规模数据处理而设计的,基于内存快速通用,可扩展的集群计算引擎,实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流,运算速度相比于MapReduce得到了显著的提高。
    2021-06-06
  • idea 找不到符号或找不到包的几种解决方法

    idea 找不到符号或找不到包的几种解决方法

    这篇文章主要介绍了idea 找不到符号或找不到包的几种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java中局部变量和成员变量的区别详解

    Java中局部变量和成员变量的区别详解

    这篇文章主要介绍了Java中局部变量和成员变量的区别,本文将通过示例为大家详细讲讲Java中成员变量与局部变量之间的区别,感兴趣的同学可以了解一下
    2023-05-05
  • HashMap红黑树入门(实现一个简单的红黑树)

    HashMap红黑树入门(实现一个简单的红黑树)

    红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树发明时被称为平衡二叉B树,后来修改为如今的“红黑树”
    2021-06-06
  • java利用java.net.URLConnection发送HTTP请求的方法详解

    java利用java.net.URLConnection发送HTTP请求的方法详解

    如何通过Java(模拟浏览器)发送HTTP请求是我们在日常经常会遇到的问题,下面这篇文章主要给大家介绍了关于java利用java.net.URLConnection发送HTTP请求的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05

最新评论