欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

優(yōu)化spring?boot應(yīng)用后6s內(nèi)啟動內(nèi)存減半

 更新時間:2022年02月22日 11:47:14   作者:kl  
這篇文章主要為大家介紹了優(yōu)化spring?boot后應(yīng)用6s內(nèi)啟動內(nèi)存減半的優(yōu)化示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

前言

taptap-developer是一個spring boot框架驅(qū)動的純Grpc服務(wù),所以,只用了四步,移除了web和spring cloud相關(guān)的模塊后,啟動速度就穩(wěn)穩(wěn)的保持在了6s內(nèi)。除了啟動速度提升外,在服務(wù)待機狀態(tài)下,內(nèi)存銳減了50%左右,從500M左右的內(nèi)存占用,縮減到了250M不到。

分析日志

日志是一個應(yīng)用的門面,在未深入了解一個應(yīng)用的架構(gòu)前,通過啟動的日志輸出基本可以分析出這個應(yīng)用的大概的技術(shù)構(gòu)成。在分析日志之前,在強調(diào)一點,這個應(yīng)用是一個純Grpc的服務(wù)。如上圖貼出的日志,是未優(yōu)化前的系統(tǒng)日志輸出,從上到下有四個紅色箭頭指向,是本次日志分析的關(guān)鍵信息,下面就這四個關(guān)鍵信息,分別分析下。然后總結(jié)出常見的優(yōu)化方法

優(yōu)化點一:關(guān)于SPRING DATA REPOSITORY SCANNING

Spring Data repository是一個高度抽象的數(shù)據(jù)訪問層接口,常見的實現(xiàn)有redis、jdbc、jpa、MongoDB、elasticsearch等等。實現(xiàn)一個Spring-data-xxx包,需要實現(xiàn)

org.springframework.data.repository.core.support.RepositoryFactorySupport抽象類

然后在!/META-INF/spring.factories文件中定義好實現(xiàn)類。spring容器啟動時,會掃描加載factories的信息。如果一個項目里有被掃描到有多個spring-data-xxx的實現(xiàn),啟動時日志就會打印

Multiple Spring Data modules found, entering strict repository configuration mode!

優(yōu)化:看到這個日志,我們就需要檢查下項目中是否用到了這些功能,比如引入了spring-data-redis,其實只用到了其攜帶的jedis,而且jedis實例可能還是自己實例化的,這個時候就可以禁用repository的功能。參考配置如下:

spring.data.redis.repositories.enabled=false

Spring Data repository有三種內(nèi)置的初始化模式,分別對應(yīng)如下:

  • DEFAULT:和Spring其他Bean一樣,在容器上下文加載時就初始化
  • DEFERRED:惰性加載,容器上下文啟動完成后開始初始化
  • LAZY:惰性加載,并且延遲注入,容器上下文啟動完成接收第一個請求時開始初始化
    如日志輸出:Bootstrapping Spring Data repositories in DEFAULT mode,默認(rèn)是隨容器啟動就開始初始化的

優(yōu)化:這里可以根據(jù)業(yè)務(wù)特點,選擇延遲加載,

參考配置spring.data.jpa.repositories.bootstrap-mode=lazy

Spring Data repository會掃描項目中的實現(xiàn)了repository接口的類,默認(rèn)情況下會盲掃所有的jar包,

日志輸出:Finished Spring Data repository scanning in 148ms. Found 0 repository interfaces.

打印出了掃描repository接口的耗時情況。

優(yōu)化:

這里可以通過@EnableRedisRepositories(basePackages = "com.taptap")指定掃描的路徑

可以顯著提升掃描加載的速度

優(yōu)化點二:關(guān)于WEBAPPLICATIONCONTEXT

在spring中,WebApplicationContext是ApplicationContext的增強,由spring-web-mvc實現(xiàn),增加了servlet、session等web相關(guān)的內(nèi)容。

從日志Initializing Spring embedded WebApplicationContext可以看出,我們初始化了一個web容器,而純Grpc服務(wù)用不到Web的容器上下文,所以移除如下依賴即可

優(yōu)化:

移除implementation('org.springframework.boot:spring-boot-starter-web')

優(yōu)化點三:關(guān)于SERVLET容器

spring-web-mvc是基于java web標(biāo)準(zhǔn)servlet設(shè)計架構(gòu)的。而servlet是由servlet容器來驅(qū)動的,常見的servlet有tocmat、jetty、undertow等。從日志中可看出,我們啟動了一個8081的servlet容器。這個不應(yīng)該出現(xiàn)在純Grpc的服務(wù)中,所以,直接移除即可。

優(yōu)化:

移除implementation 'org.springframework.boot:spring-boot-starter-undertow'

優(yōu)化點四:關(guān)于ARCHAIUS配置組件

從最后一個箭頭指向的日志信息可以分析出,項目引入了archaius配置加載組件,所以項目在啟動時,archaius會嘗試去加載默認(rèn)策略的配置源。而我們整體的技術(shù)棧,配置中心統(tǒng)一采用了apollo,所以可以直接移除,最后通過分析定位,archaius不是單獨引入的,是隨著spring-cloud-starter-netflix-hystrix一同引入,這個組件是spring-cloud-netflix微服務(wù)框架最常用的,但是在這邊,目前所有的微服務(wù)都是直接注冊到k8s容器的,所有服務(wù)的熔斷、限流、負(fù)載均衡都下沉到了容器基數(shù)設(shè)施平臺,所以應(yīng)用層面雖然引入了這個包,其實沒有實際作用,所以最后移除spring cloud相關(guān)組件

優(yōu)化:

移除implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'和

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix'組件、

附優(yōu)化后的日志輸出:

系統(tǒng)資源的變化

優(yōu)化前的

優(yōu)化后的

最后,基于資源監(jiān)控圖,從三個維度總結(jié)下,優(yōu)化后的資源占用情況:

資源名稱優(yōu)化前優(yōu)化后
內(nèi)存500M左右250M左右
總線程數(shù)10778
裝載類1292210041

以上就是優(yōu)化spring boot應(yīng)用后6s內(nèi)啟動內(nèi)存減半的詳細(xì)內(nèi)容,更多關(guān)于spring boot應(yīng)用優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文詳解Springboot中filter的原理與注冊

    一文詳解Springboot中filter的原理與注冊

    這篇文章主要為大家詳細(xì)介紹了Springboot中filter的原理與注冊的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們掌握SpringBoot有一定的幫助,需要的可以參考一下
    2023-02-02
  • eclipse漢化及jdk安裝環(huán)境配置超詳細(xì)教程(Java安裝教程)

    eclipse漢化及jdk安裝環(huán)境配置超詳細(xì)教程(Java安裝教程)

    這篇文章主要介紹了eclipse漢化及jdk安裝環(huán)境配置超詳細(xì)教程(Java安裝教程),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java多線程中的CyclicBarrier使用方法詳解

    Java多線程中的CyclicBarrier使用方法詳解

    這篇文章主要介紹了Java多線程中的CyclicBarrier使用方法詳解,CyclicBarrier是一種同步輔助工具,它允許一組線程都等待對方到達(dá)公共障礙點,在涉及固定大小的線程的程序中,CyclicBarriers非常有用,這些線程間必須相互等待,需要的朋友可以參考下
    2023-12-12
  • Java實現(xiàn)藍(lán)橋杯G將軍的示例代碼

    Java實現(xiàn)藍(lán)橋杯G將軍的示例代碼

    這篇文章主要介紹了Java實現(xiàn)藍(lán)橋杯G將軍的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java面試題及答案集錦(基礎(chǔ)題122道,代碼題19道)

    Java面試題及答案集錦(基礎(chǔ)題122道,代碼題19道)

    本文是小編收集整理的關(guān)于java基礎(chǔ)面試題及答案集錦,基礎(chǔ)題目有122道,代碼題目有19道,非常不錯,值得收藏,需要的朋友參考下
    2017-01-01
  • java同步之如何寫一個鎖Lock

    java同步之如何寫一個鎖Lock

    本篇文章的目標(biāo)一是自己動手寫一個鎖,這個鎖的功能很簡單,能進行正常的加鎖、解鎖操作。能更好地理解后面章節(jié)將要學(xué)習(xí)的AQS及各種同步器實現(xiàn)的原理。下面小編來和大家一起學(xué)習(xí)下吧
    2019-05-05
  • java中的除法運算和取模運算解讀

    java中的除法運算和取模運算解讀

    這篇文章主要介紹了java中的除法運算和取模運算,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Maven+SSM框架實現(xiàn)簡單的增刪改查

    Maven+SSM框架實現(xiàn)簡單的增刪改查

    這篇文章主要介紹了Maven+SSM框架實現(xiàn)簡單的增刪改查,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • SpringBoot RestTemplate 簡單包裝解析

    SpringBoot RestTemplate 簡單包裝解析

    這篇文章主要介紹了SpringBoot RestTemplate 簡單包裝解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Maven項目部署到Jboss出現(xiàn)Failed to create a new SAX parser

    Maven項目部署到Jboss出現(xiàn)Failed to create a new SAX parser

    這篇文章主要為大家詳細(xì)介紹了Maven項目部署到Jboss出現(xiàn)Failed to create a new SAX parser的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論