日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

最近自己用Spring Cloud Alibaba做了一個微服務架構(gòu)的項目,部署的時候遇到了難題:內(nèi)存不夠。目前該項目有7個微服務,因為我只有一臺阿里云的服務器(2C 4G),所以我只能把所有的微服務部署在一臺服務器上,部署方式是使用Docker制作springboot的fat jar鏡像,每個微服務在不加任何JVM調(diào)優(yōu)參數(shù)的情況下所占內(nèi)存約500M。

由于是微服務所以肯定還要部署:nacos,除此之外還用到了redis、sentinel、rocketmq、elk等(MySQL買的阿里云的),光是運行這些應用就占用內(nèi)存2個多G,剩下的1個多G內(nèi)存在部署4個微服務后就滿了,于是開始對springboot應用的內(nèi)存進行初步優(yōu)化:

添加jvm參數(shù)優(yōu)化內(nèi)存大小

# JVM初始分配的內(nèi)存由-Xms指定,默認是物理內(nèi)存的1/64 -Xms128m # JVM最大分配的內(nèi)存由-Xmx指定,默認是物理內(nèi)存的1/4 -Xmx128m # 規(guī)定了每個線程虛擬機棧及堆棧的大小,一般情況下,256k是足夠的,此配置將會影響此進程中并發(fā)線程數(shù)的大小。 -Xss256k # 指定并行GC線程的數(shù)量,一般最好和CPU核心數(shù)量相當 -XX:ParallelGCThreads=2

默認空余堆內(nèi)存小于40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時,JVM會減少堆直到 -Xms的最小限制。

因此服務器一般設置-Xms、-Xmx相等以避免在每次GC 后調(diào)整堆的大小。對象的堆內(nèi)存由稱為垃圾回收器的自動內(nèi)存管理系統(tǒng)回收。

默認情況下,當 CPU 數(shù)量小于8, ParallelGCThreads 的值等于 CPU 數(shù)量,我的服務器是2C的所以這個參數(shù)可省略。配置完成后,啟動服務發(fā)現(xiàn)內(nèi)存確實變小了,由原來的500M降至100~200M,但不是我想要的效果,我期望的效果是達到幾十M的級別。

經(jīng)網(wǎng)上查閱大量資料得知可以使用Spring Native這門新技術來實現(xiàn)我的需求。(該技術正處于快速迭代階段,變動較大,建議用于個人學習,不要用于生產(chǎn))

SpringBoot項目使用Spring Native后:

 

  1. 應用啟動速度特別快,毫秒級別
  2. 運行時更低的內(nèi)存消耗,官方展示的含有Spring Boot, Spring MVC, Jackson, Tomcat的鏡像大小是50M
  3. 為了達到前面的效果,代價是構(gòu)建時間更長(即使是一個Hello word構(gòu)建也需要2分鐘,不過主要取決于電腦配置,我的是2min左右)
Spring Native是什么

 

簡而言之就是為了提高JAVA在云原生的競爭力(個人理解)。

以下內(nèi)容摘抄自GitHub上Spring Native的自述文件:

 

Spring Native 為使用GraalVM 原生映像編譯器將 Spring 應用程序編譯為原生可執(zhí)行文件提供 beta 支持,以提供通常設計為打包在輕量級容器中的原生部署選項。實際上,目標是在這個新平臺上支持幾乎未修改的 Spring Boot 應用程序。

 

以下內(nèi)容摘抄自其他博客:

 

近幾年“原生”一詞一直泛濫在云計算、邊緣計算等領域中,而原生寵幸的語言也一直都是Golang,Rust等脫離Sandbox運行的開發(fā)語言。Java得益于上世紀流行的一次編譯,到處執(zhí)行的理念,流行至今,但也因為這個原因,導致java程序脫離不了JVM運行環(huán)境,使得不那么受原生程序的青睞。在云原生泛濫的今天,臃腫的JVM使Java應用程序?qū)Ρ绕渌Z言顯得無比的龐大,各路大神也想了很多方式讓Java變的更“原生”。

 


 

實戰(zhàn)

本次實戰(zhàn)相關的環(huán)境信息如下:

 

  • OS:windows10 21H1
  • IDE:IntelliJ IDEA 2021.2.3
  • JDK:graalvm-ce-java11-21.3.0
  • Maven:3.6.3
  • Docker Desktop for Windows: 20.10.12
  • Spring Boot:2.6.2
  • Spring Native:0.11.1

 


 

從官方文檔得知(上圖)

使用 Spring Native 的應用程序應該使用 Java 11 或 Java 17 編譯。

構(gòu)建 Spring Boot 原生應用程序有兩種主要方法:

 

  1. 使用Spring Boot Buildpacks 支持生成包含本機可執(zhí)行文件的輕量級容器。
  2. 使用GraalVM 原生鏡像 Maven 插件支持生成原生可執(zhí)行文件。

 

經(jīng)過各種踩坑后在本機上成功的使用了方法1和方法2。簡單來說:

方法1就是在SpringBoot2.3后,可以使用spring-boot-maven-plugin插件來構(gòu)建docker鏡像,使用mvn spring-boot:build-image命令結(jié)合Docker的API來實現(xiàn)Spring Boot 原生應用程序的構(gòu)建,成功執(zhí)行后會直接生成一個docker鏡像,然后run這個鏡像就可以了,不用我們再寫Dockerfile了,相關的參數(shù)配置都在pom.xml中配置(該插件的configuration標簽下,和fabric8或spotify的docker-maven-plugin很相似)。

方法2不需要安裝docker,但要安裝Visual Studio,然后執(zhí)行mvn -Pnative package命令后會生成一個可執(zhí)行文件(.exe),運行即可。

主要區(qū)別如下

1 環(huán)境依賴不同

  • 方法1需要安裝Docker
  • 方法2需要安裝Visual Studio(需要用到部分單個組件:2個MSVC,1個Windows 10 SDK)
2 執(zhí)行的maven命令不同
  • 方法1是mvn spring-boot:build-image
  • 方法2是mvn -Pnative package

 

因為每個微服務使用Docker部署而不是exe文件,所以方法1正好符合我的需求,所以后文使用Spring Boot Buildpacks的方式構(gòu)建Spring Boot原生應用程序。

1 安裝Graal VM(graalvm-ce-java11-windows-amd64)

官方下載地址:

 

https://www.graalvm.org/downloads/

 


 


 

2 配置環(huán)境變量


 


 


 

針對方法1的話,上面三張圖好像只用配置JAVA_HOME就行,想一次成功的話建議3個都配,后續(xù)可以自行測試。擴展:最全的java面試題庫

檢驗是否安裝成功


 

3 安裝native-image

打開新的cmd,輸入以下命令,等待安裝

gu install native-image

這一步我執(zhí)行失敗了,解決方法就是從github上手動下載native-image,然后解壓、安裝

 

https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.3.0/native-image-installable-svm-java11-windows-amd64-21.3.0.jar

 

jar用WinRAR也是可以解壓的,解壓后如下


 

在bin目錄下打開cmd,輸入以下命令,等待安裝

$ gu install -L native-image* 4 安裝 Desktop for Windows

具體步驟略,按照官方文檔操作即可:

 

https://docs.docker.com/desktop/windows/install/
5 配置pom.xml

 

前面都是準備工作,這一步開始才是重點

首先快速創(chuàng)建一個Spring Boot項目,我命名為spring-native

完整的pom如下

4.0.0 org.springframework.boot spring-boot-starter-parent 2.6.2 ltd.pcdd spring-native 0.0.1-SNAPSHOT spring-native spring-native 11 0.11.1 org.springframework.boot spring-boot-starter-web org.springframework.experimental spring-native ${spring-native.version} org.springframework.experimental spring-aot-maven-plugin 0.11.1 generate generate org.springframework.boot spring-boot-maven-plugin  paketobuildpacks/builder:tiny true spring-release Spring release https://repo.spring.io/release spring-release Spring release https://repo.spring.io/release

本文介紹的是Spring Native0.11.1版本,其對應的Spring Boot版本必須是2.6.2,以上只是一個最基本的配置案例,實際開發(fā)中還需要在spring-boot-maven-plugin插件的configuration標簽下配置其他許許多多的參數(shù)。

例如docker遠程的地址和證書的路徑、jvm調(diào)優(yōu)參數(shù)、配置文件指定、docker鏡像名端口倉庫地址等等,最好的方法就是看spring-boot-maven-plugin的官方文檔,這里以配置jvm參數(shù)為例


 

通過官方文檔得知只需要在configuration標簽下配置即可,例如

 paketobuildpacks/builder:tiny true -Xms128m -Xmx128m -Xss256k -XX:ParallelGCThreads=2 -XX:+PrintGCDetails

其他的配置參數(shù)還有很多。擴展:最全的java面試題庫

官方文檔:

 

https://docs.spring.io/spring-boot/docs/2.6.2/maven-plugin/reference/htmlsingle/#build-image
6 執(zhí)行maven命令 mvn clean mvn '-Dmaven.test.skip=true' spring-boot:build-image

 

下載完相關依賴后,電腦風扇就開始呼呼的轉(zhuǎn),查看任務管理器發(fā)現(xiàn)CPU利用率100%,內(nèi)存使用量飆升,最后穩(wěn)定在90%+。

構(gòu)建成功


 

7 創(chuàng)建并運行容器

查看所有鏡像


 

spring-native就是構(gòu)建的鏡像

創(chuàng)建并運行容器


 

在Docker Desktop查看日志,發(fā)現(xiàn)應用成功啟動,啟動僅耗時。,也就是59ms,果然印證了Spring Native啟動是毫秒級別這句話。


 

成功調(diào)用接口


 

在Docker Desktop查看占用內(nèi)存,僅28M左右。


 

不使用Spring Native啟動應用


 


 

啟動耗時3s,占用內(nèi)存高達511M,高下立判。

文章僅供參考,建議結(jié)合Spring Native官方最新文檔學習。

 

https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/index.html 原文鏈接:https://mp.weixin.qq.com/s/y6wRXxMDvy8r-fqmWjvI3Q

分享到:
標簽:SpringBoot
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定