1. 程式人生 > 其它 >Springboot專案優化和jvm調優

Springboot專案優化和jvm調優

關於GC有一個常見的疑問是,在啟動時,我的記憶體如何分配?經過前面的介紹,已經很容易知道,用-Xmn,-Xmx,-Xms,-Xss,-XX:NewSize,-XX:MaxNewSize,-XX:MaxPermSize,-XX:PermSize,-XX:SurvivorRatio,-XX:PretenureSizeThreshold,-XX:MaxTenuringThreshold就基本可以配置記憶體啟動時的分配情況。但是,具體配置多少?設定小了,頻繁GC(甚至記憶體溢位),設定大了,記憶體浪費。結合前面對於記憶體區域和其作用的學習,儘量考慮如下建議

-XX:PermSize儘量比-XX:MaxPermSize小,-XX:MaxPermSize>= 2 * -XX:PermSize, -XX:PermSize> 64m,一般對於4G記憶體的機器,-XX:MaxPermSize不會超過256m;

-Xms = -Xmx(線上Server模式),以防止抖動,大小受作業系統和記憶體大小限制,如果是32位系統,則一般-Xms設定為1g-2g(假設有4g記憶體),在64位系統上,沒有限制,不過一般為機器最大記憶體的一半左右;

-Xmn,在開發環境下,可以用-XX:NewSize和-XX:MaxNewSize來設定新生代的大小(-XX:NewSize<=-XX:MaxNewSize),在生產環境,建議只設置-Xmn,一般-Xmn的大小是-Xms的1/2左右,不要設定的過大或過小,過大導致老年代變小,頻繁Full GC,過小導致minor GC頻繁。如果不設定-Xmn,可以採用-XX:NewRatio=2來設定,也是一樣的效果;

-Xss一般是不需要改的,預設值即可。

-XX:SurvivorRatio一般設定8-10左右,推薦設定為10,也即:Survivor區的大小是Eden區的1/10,一般來說,普通的Java程式應用,一次minorGC後,至少98%-99%的物件,都會消亡,所以,survivor區設定為Eden區的1/10左右,能使Survivor區容納下10-20次的minor GC才滿,然後再進入老年代,這個與 -XX:MaxTenuringThreshold的預設值15次也相匹配的。如果XX:SurvivorRatio設定的太小,會導致本來能通過minor回收掉的物件提前進入老年代,產生不必要的full gc;如果XX:SurvivorRatio設定的太大,會導致Eden區相應的被壓縮。

設定Jvm引數

例如要配置JVM引數如下:
-server -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn512m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC

說明:
-XX:MetaspaceSize=128m (元空間預設大小)
-XX:MaxMetaspaceSize=128m (元空間最大大小)
-Xms1024m (堆最大大小)
-Xmx1024m (堆預設大小)
-Xmn512m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分割槽比例 8:2,Eden/s0)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,這裡使用CMS收集器)
-XX:+PrintGCDetails (列印詳細的GC日誌)

JDK8之後把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是
-XX:MetaspaceSize=128m (元空間預設大小) -XX:MaxMetaspaceSize=128m (元空間最大大小)
JDK 8開始把類的元資料放到本地化的堆記憶體(native heap)中,這一塊區域就叫Metaspace,中文名叫元空間。
使用本地化的記憶體有什麼好處呢?最直接的表現就是java.lang.OutOfMemoryError: PermGen 空間問題將不復存在,因為預設的類的元資料分配只受本地記憶體大小的限制,也就是說本地記憶體剩餘多少,理論上Metaspace就可以有多大(貌似容量還與作業系統的虛擬記憶體有關?這裡不太清楚),這解決了空間不足的問題。
不過,讓Metaspace變得無限大顯然是不現實的,因此我們也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize引數來指定Metaspace區域的大小。JVM預設在執行時根據需要動態地設定MaxMetaspaceSize的大小。


$ java -server -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn512m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar erbadagang-1.0.0.jar

作者:梅西愛騎車
連結:https://www.jianshu.com/p/e8cfa78ee8d7
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:梅西愛騎車
連結:https://www.jianshu.com/p/e8cfa78ee8d7
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。