組件自動掃描帶來的問題
默認情況下,我們會使用 @SpringBootApplication 注解來自動獲取應用的配置信息,但這樣也會給應用帶來一些副作用。使用這個注解后,會觸發自動配置( auto-configuration )和 組件掃描 ( component scanning ),這跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三個注解的作用是一樣的。這樣做給開發帶來方便的同時,也會有三方面的影響:
1、會導致項目啟動時間變長。當啟動一個大的應用程序,或將做大量的集成測試啟動應用程序時,影響會特別明顯。
2、會加載一些不需要的多余的實例(beans)。
3、會增加 CPU 消耗
針對以上三個情況,我們可以移除 @SpringBootApplication 和 @ComponentScan 兩個注解來禁用組件自動掃描,然后在我們需要的 bean 上進行顯式配置:
// @SpringBootApplication
@ComponentScan(basePackages = {"com.yiyang.myfirstspringdemo.controller", "com.yiyang.myfirstspringdemo.service"})
@EnableAutoConfiguration
public class MyFirstSpringDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MyFirstSpringDemoApplication.class, args);
}
}
注意:這種指定掃描包的優化方式,只會減少程序在啟動時的速度,並不能在程序運行時,起到優化作用。
將Servlet容器變成Undertow
默認情況下,Spring Boot 使用 Tomcat 來作為內嵌的 Servlet 容器
可以將 Web 服務器切換到 Undertow 來提高應用性能。Undertow 是一個采用 Java 開發的靈活的高性能 Web 服務器,提供包括阻塞和基於 NIO 的非堵塞機制。Undertow 是紅帽公司的開源產品,是 Wildfly 默認的 Web 服務器。首先,從依賴信息里移除 Tomcat 配置:
先移除toacat配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
飲用undertow依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
使用jmeter測試吞吐量
服務器 | 第一次 | 第二次 | 第三次 |
---|---|---|---|
tomcat | 681 | 741 | 761 |
undertow | 776 | 808 | 894 |
這是我測試的結果。看別人測試的結果,效果還是很顯著的。
SpringBoot JVM參數調優
內部
這個根據服務器的內存大小,來設置堆參數。
-Xms :設置Java堆棧的初始化大小
-Xmx :設置最大的java堆大小
實例參數-XX:+PrintGCDetails -Xmx32M -Xms1M
外部運行調優
java -server -Xms32m -Xmx32m -jar springboot_v2.jar
一般都會將初始值和最大值設置成一樣,減少GC回收的次數。