Springboot 性能优化(亲测)——SpringBoot学习

2023-11-04

  SpringBoot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。
  尽管 SpringBoot 拥有这么多的优点,但也存在性能问题,这并不和它拥有如此多的优点相冲突,应用程序性能只有更优,没有最优。
  对于 SpringBoot 性能优化可以从注解 @SpringBootApplication 上优化,Servlet 容器上优化, JVM 上优化等等。我们分别从这三方面进行优化。


测试机器信息:

OS :Windows 10 专业版

CPU :Intel® Core™ i5-3230M @2.6GHz

RAM :8 GB

ROM :120G SSD + 500G HDD

JDK :Java version “1.8.0_171”

Eclipse :Eclipse Java EE IDE for Web Developers 4.7.3a

MySQL :MySQL Version 5.6.15

一、优化注解 @SpringBootApplication

  @SpringBootApplication 是Springboot 整合的一个复合注解,作用相当于 @Configuration + @EnableAutoConfiguration + @ComponentScan ,这个可以查看 @SpringBootApplication 源码得知,其中有一句 This is a convenience annotation that is equivalent to declaring {@code @Configuration},{@code @EnableAutoConfiguration} and {@code @ComponentScan} 说的就是这个意思。

/*
 * Copyright 2012-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.core.annotation.AliasFor;

/**
 * Indicates a {@link Configuration configuration} class that declares one or more
 * {@link Bean @Bean} methods and also triggers {@link EnableAutoConfiguration
 * auto-configuration} and {@link ComponentScan component scanning}. This is a convenience
 * annotation that is equivalent to declaring {@code @Configuration},
 * {@code @EnableAutoConfiguration} and {@code @ComponentScan}.
 *
 * @author Phillip Webb
 * @author Stephane Nicoll
 * @since 1.2.0
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

	/**
	 * Base packages to scan for annotated components. Use {@link #scanBasePackageClasses}
	 * for a type-safe alternative to String-based package names.
	 * @return base packages to scan
	 * @since 1.3.0
	 */
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};

	/**
	 * Type-safe alternative to {@link #scanBasePackages} for specifying the packages to
	 * scan for annotated components. The package of each class specified will be scanned.
	 * <p>
	 * Consider creating a special no-op marker class or interface in each package that
	 * serves no purpose other than being referenced by this attribute.
	 * @return base packages to scan
	 * @since 1.3.0
	 */
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};

}

  由于其中包括有包扫描的注解 @ComponentScan ,这会导致项目启动时间变长(启动一个大的应用程序或做大量的集成测试启动应用程序时,影响会特别明显),会加载一些多余的实例(Beans),也会增加 CPU 消耗。

  所以可以将 @SpringBootApplication 注解改为 @EnableAutoConfiguration + @Configuration + 在我们需要的 bean 上进行显式配置注解。

  通过实际使用 @SpringBootApplication 注解 和 使用 @EnableAutoConfiguration + @Configuration 注解分别各测试启动 5 次 记录实际启动时间,最后取 5 次的平均时间来比较性能的变化,JVM 各参数默认,测试的详细数据见下。

测试项目 使用 @SpringBootApplication 注解 使用 @EnableAutoConfiguration + @Configuration 注解
第一次测试耗时 19.742s/20.867s 18.160s/19.291s
第二次测试耗时 19.407s/20.563s 18.388s/19.496s
第三次测试耗时 21.734s/22.903 18.308s/19.721s
第四次测试耗时 19.908s/21.090s 18.576s/19.708s
第五次测试耗时 19.456s/20.650s 18.418s/19.699s
平均耗时 20.049s/21.215s 18.370s/19.583s

   表格说明:此表基于上述环境测试的真实值,平均耗时取有效小数5位。19.742s/20.867s :表示 应用启动耗时19.742秒,JVM启动耗时20.867秒。
  通过上述测试数据发现使用 @EnableAutoConfiguration + @Configuration 注解 可以提高应用程序启动的性能。

二、将 Servlet 容器由 Tomcat 变成 Undertow

  默认情况下 Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器,我们可以将 Web 服务器切换到 Undertow 来提高应用性能。Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。接下来我们使用 Jmeter 分别测试使用 Tomcat 容器 和 Undertow 容器在同一个查询数据库信息的接口下的各自的并发量。设置 JVM 参数:-server -XX:+PrintGCDetails -Xms2048m -Xmx2048m,测试数据如下。

测试项目 Tomcat 容器 Undertow 容器
第一次吞吐量测试 315.3/sec 395.0/sec
第二次吞吐量测试 421.6/sec 453.2/sec
第三次吞吐量测试 327.8/sec 448.8/sec
第四次吞吐量测试 351.4/sec 340.0/sec
第五次吞吐量测试 431.1/sec 433.2/sec
平均吞吐量 369.44/sec 414.04/sec

   表格说明:此表基于上述环境测试的真实值,平均吞吐量取有效小数5位。
  由上表数据可以看出将 Tomcat 容器换为 Undertow 容器将会提高应用性能。

三、JVM 调优

  关于 JVM 调优需要了解服务器基本参数配置,JVM 基本组成结构,垃圾回收算法,垃圾回收机制,JVM 调优工具,调优经验等等等,这里不详细列举。
  这里就以 JVM 参数 -server -XX:+PrintGCDetails -Xms512m -Xmx512m-server -XX:+PrintGCDetails -Xms2048m -Xmx2048m 为例,还是测试吞吐量,对于参数 -server -XX:+PrintGCDetails -Xms2048m -Xmx2048m 的数据从Tomcat 容器下吞吐量的测试得来,就不做重复测试了,然后测试参数 -server -XX:+PrintGCDetails -Xms512m -Xmx512m 在 Tomcat 容器下的吞吐量,测试数据见下表。

测试项目 Tomcat 512M Tomcat 2048M
第一次吞吐量测试 300.5/sec 315.3/sec
第二次吞吐量测试 293.5/sec 421.6/sec
第三次吞吐量测试 282.6/sec 327.8/sec
第四次吞吐量测试 302.8/sec 351.4/sec
第五次吞吐量测试 309.5/sec 431.1/sec
平均吞吐量 297.78/sec 369.44/sec

   表格说明:此表基于上述环境测试的真实值,平均吞吐量取有效小数5位。
  数据说明JVM 参数 `-server -XX:+PrintGCDetails -Xms2048m -Xmx2048m` 比 `-server -XX:+PrintGCDetails -Xms512m -Xmx512m` 要优。进行 JVM 调优是一个谨慎细致的过程,需要慢慢的试,直到当前最优为止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot 性能优化(亲测)——SpringBoot学习 的相关文章

随机推荐

  • 深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

    系列文章目录 C 高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 LSP 接口隔离原则 系列文章目录 1 接口隔离原则的定义和解读 2 案例解读 3 如何判断一个接口是否符合接口隔离原则 小结 1
  • 如何用element-ui的table做一个模糊搜索功能

    一 在表格标题处增加一个input用来根据关键字搜索库房 用v model search 绑定输入 下面是
  • Hash算法

    目录 一 Hash基本概念 1 特点 2 hash的目的及用途 二 常用Hash算法 1 MD5算法 2 加盐 3 SHA系列算法与HashTools工具类 4 RipeMD 160算法 一 Hash基本概念 哈希算法也叫摘要算法 是一种用
  • 一文搞懂什么是 PostCSS

    一文搞懂什么是 PostCSS 在 Web 应用开发中 CSS 代码的编写是重要的一部分 CSS 规范从最初的 CSS1 到现在的 CSS3 再到 CSS 规范的下一步版本 规范本身一直在不断的发展演化之中 这给开发人员带来了效率上的提高
  • [转]转型后的BlackBerry“恋上”汽车市场,QNX拿什么与免费的安卓/Linux对抗?

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com BlackBe
  • 深信服应用交付管理系统远程命令执行漏洞复现

    文章目录 深信服应用交付管理系统远程命令执行漏洞复现 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 访问漏洞环境 2 构造POC 3 复现 深信服应用交付管理系统远程命令执行漏洞复现 0
  • springboot 打成jar后读取resources下面的文件

    1 使用idea开发过程中获取resources的路径是使用的这个方法 File file ResourceUtils getFile ResourceUtils CLASSPATH URL PREFIX 文件名称 data 然后就可以获取
  • idea中连接mysql插入成功数据,在navicat中刷新表格没有数据?

    目录 一 出现问题 二 尝试解决 三 发现问题 四 解决方法 一 出现问题 在写一个数据库的大作业时 在idea中连接mysql后 测试insert的dao方法 在控制台没有报错 显示题添加数据成功 但是在navicat中刷新表格却没有数据
  • 开发日记(5) 我们如何让EditText的光标消失呢?

    很多日子没有分享文章 赶项目呢 3人5项目 好烦啊 正题 这是分享的 原文章 http www cnblogs com yejiurui archive 2013 01 02 2841945 html 在我们的应用中 有时候一进入一个页面
  • 安卓混合开发,使用WebView控件展示网页

    页面使用webview控件来实现 WebView是Android系统提供能显示网页的系统控件 它是一个特殊的View 他的作用就是 显示和渲染Web页面 加载网络上或本地assets中的html文件 与JavaScript交互调用 常用于同
  • Win10自带虚拟机Hyper-V安装NOI Linux2.0

    下载NOI Linux ubuntu noi v2 0https noiresources ccf org cn ubuntu noi v2 0 iso速度有亿点慢 建议用下载器 开启Hyper V 注意 win10家庭版没有此功能 可以自
  • Qt5类之QMargins

    QMargins Class include
  • Python——构建多级菜单系统

    构建多级菜单系统 一 一级菜单 首先简单地尝试一下 运行结果 二 二级菜单 稍微要复杂一点 运行结果 以下两种 三 三级菜单 因为嵌套的越来越多了 所以代码看起来冗长复杂 运行了两种结果 总之每多一级 就相当于是多嵌套了一层 级数越多代码就
  • ArcFace/InsightFace使用自己数据训练/验证过程(3)

    分类专栏 人脸识别 InsightFace训练过程 文章标签 insightface自定义数据训练 arcface训练 人脸识别训练过程 版权 人脸识别 同时被 2 个专栏收录 4 篇文章1 订阅 订阅专栏 InsightFace训练过程
  • DWORD类型

    DWORD 类型基本相关 DWORD 宏定义 typedef unsigned long DWORD 1 要使用DWORD要添加头文件
  • 【好题】第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 G-Num 思维+推公式

    题 推公式 a b a b a b 1 b a b 1 b 1 1 a 1 b 1 1 因此 令n 若n为质数 说明没有一个 a 1 b 1 可以组成它 就输出No 代码 include
  • Unity入门教程

    一 介绍 目的 通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏 熟悉使用Unity进行游戏开发的基本流程 软件环境 Unity 2017 3 0f3 Visual Studio 2013 二 创建新项目 1 启动Unity后将出现一个并
  • Source Insight 4下载及中文乱码解决

    Source Insight 4 00 0121含补丁和许可证激活码 source insight 4下载链接 https www sdbeta com wg 2019 0621 230136 html 梳理 先配置整个工程为GB2312
  • 知乎越来越无聊了,真是想破了脑袋找可以装逼的地方!

    什么有一个优秀的女友是什么感觉 有个青梅竹马的女友又是什么感觉 你不如说和优秀的女友操B做爱是什么感觉 反正操多了就是那么回事 对不对 最烦这些装逼的家伙
  • Springboot 性能优化(亲测)——SpringBoot学习

    SpringBoot 是一个快速开发框架 能够快速的整合第三方框架 简化XML配置 全部采用注解形式 内置Tomcat容器 帮助开发者能够实现快速开发 SpringBoot的Web组件 默认集成的是SpringMVC框架 尽管 Spring