調(diào)優(yōu)參考:https://developer.aliyun.com/article/690392
高級(jí)程序員必不可少的技能,這個(gè)也是高薪必問的問題
能夠有效通過 JVM 調(diào)優(yōu)提升系統(tǒng)性能的人往往被人們冠以”大藕鹨埃”、”大師”之類的稱呼晤愧。
過程
- 在項(xiàng)目啟動(dòng)時(shí)加上必要的參數(shù)
-XX:+PrintGC -XX:+PrintGCCause -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/Users/aihe/idea/idea_gc.txt -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/issue_error
這一步gceasy.io網(wǎng)站上兆览,直接就給了提示,增加metaspace的大小琴许,在參數(shù)設(shè)置中聋涨,我們沒有看到設(shè)置metaspace晾浴,那么下面一步做調(diào)整。
image
- 新生代牍白,MetaSpace不夠用脊凰,增加如下參數(shù)
初始堆內(nèi)存與最大堆內(nèi)存大小設(shè)為一致,這樣虛擬機(jī)一次性的分配內(nèi)存茂腥,而不至于在初始堆大小不夠用又向系統(tǒng)分配內(nèi)存
-Xmx2048m -Xms2048m -Xmn1024m -XX:MetaspaceSize=512m
這次參數(shù)變更為如下:
-Dfile.encoding=UTF-8
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:-OmitStackTraceInFastThrow
-Xverify:none
-XX:+PrintGC
-XX:+PrintGCCause
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:/Users/aihe/idea/idea_gc.txt
-XX:+DisableExplicitGC
-Xmx2048m
-Xms2048m
-Xmn1024m
-XX:MetaspaceSize=521m
想查看每個(gè)具體的屬性含義可以用:
java -XX:+PrintFlagsFinal或者去Oracle文檔查看詳細(xì)介紹
- 啟動(dòng)idea狸涌,打開項(xiàng)目,在gceasy.io網(wǎng)站上分析垃圾收集日志, 可以看到幾個(gè)常用的指標(biāo):
新生代最岗,老年代分配的空間帕胆,以及使用的內(nèi)存峰值
image
吞吐量及暫停時(shí)間:
- 吞吐量:吞吐量是指應(yīng)用程序線程用時(shí)占程序總用時(shí)的比例
- 暫停時(shí)間:指一個(gè)時(shí)間段內(nèi)應(yīng)用程序線程讓與 GC 線程執(zhí)行而完全暫停。
image
- 換一下垃圾收集器試試
-XX:+UseG1GC
看起來吞吐量也降低了般渡,暫停時(shí)間也增加了懒豹。
image
image
- 新增一個(gè)GC參數(shù)芙盘,最大的停頓時(shí)間為50ms,這個(gè)參數(shù)
這個(gè)參數(shù)不是硬性要求脸秽,JVM只是會(huì)盡最大的努力來達(dá)到這個(gè)要求儒老,但是還是可能超過這個(gè)值
-XX:MaxGCPauseMillis=50
貌似沒啥變化,就不貼圖了
新增參數(shù)记餐,初始堆占用百分比:
-XX:InitiatingHeapOccupancyPercent=50
看起來效果也不是特別好
image
增加垃圾收集器的并發(fā)線程數(shù):驮樊,效果反而更差了。
-XX:ParallelGCThreads=20 //設(shè)置并行回收時(shí)GC的線程數(shù)
-XX:ConcGCThreads=5
G1的垃圾收集器階段:
- 初始標(biāo)記
- 并發(fā)標(biāo)記
- 最終標(biāo)記
- 篩選回收
- 用一下CMS垃圾收集器看看
-XX:+UseConcMarkSweepGC
效果好些還是不如最初的狀態(tài)
image
- 我們還是用最開始的垃圾收集器組合吧片酝。
image
-XX:+UseParallelGC
最后
對(duì)JVM這塊不夠大的指標(biāo)就看吞吐量和暫停時(shí)間囚衔,更細(xì)的指標(biāo)需要大家一起探索