公司的一台雲服務器部署了若干spring boot項目,內存配置從4G加到了16G,但還是很吃緊,因為這幾個項目用戶量不大,負載也不高,於是決定想辦法優化一下內存占用。以其中一個項目為例記錄一下優化過程。
優化前
以gradle bootRun命令啟動項目以后,會產生三個進程:GradleDaemon、GradleMain和Application進程。

jps截圖
占用內存情況如下:

mac活動監視器截圖
GradleDaemon和GradleMain進程合起來占用400多M,其實很多余,於是決定把項目打成jar包,通過java -jar命令來啟動服務。
spring boot項目打成jar包
首先、在build.gradle文件里加上spring boot gradle plugin
plugins { id "org.springframework.boot" version "1.5.9.RELEASE" }
或者是
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath(
"org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'org.springframework.boot'
其次、因為目的是打成可執行jar包,所以還要加上
apply plugin: 'java'
然后、寫上mainClass
bootRepackage {
mainClass = 'com.idatage.XXXApplication'
}
最后、命令行輸入如下命令
gradle clean build
就在build/libs目錄下生成可執行jar包了。
再看內存占用

jps截圖
現在GradleDaemon和GradleMain進程都沒有了。但是...

活動監視器截圖
內存占用不降反增。看來我得靠調節jvm參數了。
調節jvm參數
通過設定Xmx(程序運行期間最大可占用的內存大小)、Xss(jvm啟動的每個線程分配的內存大小)、XX:ParallelGCThreads(GC線程數)以及關閉了JIT功能,達成了降低內存占用的目的。
java -Xmx128m -Xss256k -XX:ParallelGCThreads=2 -Djava.compiler=NONE -jar build/libs/XXX.jar

活動監視器截圖
現在內存降到了200M以內了。
為了確保Xmx128m這個參數值合理,我用了jvisualvm這個工具查看啟動時的堆使用情況:

jvisualvm截圖
可以看到實際使用的堆大小不超過75M,所以128M應該還是可以的。
作者:wubin1989
鏈接:https://www.jianshu.com/p/abd9c24a6910
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。