springboot如何進行優化

NO IMAGE

這一部分分為三個部分,啟動部分的優化,Tomcat引數設定和記憶體調優

啟動部分的優化

這一小節來自 Spring Boot 效能優化  http://www.cnblogs.com/chen110xi/p/6198481.html
springboot啟動優化主要是不要載入一些沒有用的類檔案
元件自動掃描帶來的問題
預設情況下,我們會使用 @SpringBootApplication 註解來自動獲取應用的配置資訊,但這樣也會給應用帶來一些副作用。使用這個註解後,會觸發自動配置( auto-configuration )和 元件掃描 ( component scanning ),這跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三個註解的作用是一樣的。這樣做給開發帶來方便的同時,也會有三方面的影響:
1、會導致專案啟動時間變長。當啟動一個大的應用程式,或將做大量的整合測試啟動應用程式時,影響會特別明顯。
2、會載入一些不需要的多餘的例項(beans)。
3、會增加 CPU 消耗。
針對以上三個情況,我們可以移除 @SpringBootApplication 和 @ComponentScan 兩個註解來禁用元件自動掃描,然後在我們需要的 bean 上進行顯式配置:

// 移除 @SpringBootApplication and @ComponentScan, 用 @EnableAutoConfiguration 來替代
@Configuration
@EnableAutoConfiguration
public class SampleWebUiApplication {
// 用 @Bean 註解顯式配置,以便被 Spring 掃描到
@Bean
public MessageController messageController(MessageRepository messageRepository) {
return new MessageController(messageRepository);
}

如何避免元件自動掃描帶來的問題
我們在上面提到,@SpringBootApplication 註解的作用跟 @EnableAutoConfiguration 註解的作用是相當的,那就意味著它也能帶來上述的三個問題。要避免這些問題,我們就要知道我們需要的元件列表是哪些,可以用 -Ddebug 的方式來幫助我們明確地定位:

mvn spring-boot:run -Ddebug
…
=========================
AUTO-CONFIGURATION REPORT
=========================
Positive matches:
-----------------
DispatcherServletAutoConfiguration
- @ConditionalOnClass classes found: org.springframework.web.servlet.DispatcherServlet (OnClassCondition)
- found web application StandardServletEnvironment (OnWebApplicationCondition)


接著拷貝 Positive matches 中列出的資訊:

DispatcherServletAutoConfiguration
EmbeddedServletContainerAutoConfiguration
ErrorMvcAutoConfiguration
HttpEncodingAutoConfiguration
HttpMessageConvertersAutoConfiguration
JacksonAutoConfiguration
JmxAutoConfiguration
MultipartAutoConfiguration
ServerPropertiesAutoConfiguration
PropertyPlaceholderAutoConfiguration
ThymeleafAutoConfiguration
WebMvcAutoConfiguration
WebSocketAutoConfiguration

然後來更新專案配置,顯式地引入這些元件,引入之後,再執行一下應用確保沒有錯誤發生:

@Configuration
@Import({
        DispatcherServletAutoConfiguration.class,
        EmbeddedServletContainerAutoConfiguration.class,
        ErrorMvcAutoConfiguration.class,
        HttpEncodingAutoConfiguration.class,
        HttpMessageConvertersAutoConfiguration.class,
        JacksonAutoConfiguration.class,
        JmxAutoConfiguration.class,
        MultipartAutoConfiguration.class,
        ServerPropertiesAutoConfiguration.class,
        PropertyPlaceholderAutoConfiguration.class,
        ThymeleafAutoConfiguration.class,
        WebMvcAutoConfiguration.class,
        WebSocketAutoConfiguration.class,
})
public class SampleWebUiApplication {
 

在上面的程式碼中,我們可以刪掉我們不需要的元件資訊,來提高應用的效能,比如在我的專案中,不需要 JMX 和 WebSocket 功能,我就刪掉了它們。刪掉之後,再次執行專案,確保一切正常。

tomcat連線數

這部分和原來的形式有所區別,需要在Tomcat的配置檔案中修改,如:

<Connector port="8080" address="localhost"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8181" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
對於springboot只需要在程式碼中的配置檔案application.properties進行配置即可,如:
server.tomcat.max-connections=1000
server.tomcat.max-threads=250

tomcat記憶體調優

由於springboot內嵌tomcat和傳統的方式有所區別,我們之前要更改檔案(catalina.sh) 位於”\tomcat server folder\bin\catalina.sh”,下面,給出這個檔案的配置資訊,
JAVA_OPTS=”-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms1024m -Xmx1024m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX: DisableExplicitGC”
而在springboot中我們需要在啟動的時候指定一些引數命令,例如下邊這種形式
java -Xmx4096m  -Xss256k -jar myapp-rest-service-0.1.0.jar
如果麻煩我們可以將啟動命令寫在指令碼之中,每次啟動的時候執行指令碼就行了,關於這塊的優化可以參照https://spring.io/blog/2015/12/10/spring-boot-memory-performance