調(diào)優(yōu)參考:https://developer.aliyun.com/article/690392
高級程序員必不可少的技能,這個也是高薪必問的問題
能夠有效通過 JVM 調(diào)優(yōu)提升系統(tǒng)性能的人往往被人們冠以”大牛”、”大師”之類的稱呼。
過程
- 在項(xiàng)目啟動時加上必要的參數(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
想查看每個具體的屬性含義可以用:
java -XX:+PrintFlagsFinal或者去Oracle文檔查看詳細(xì)介紹
- 啟動idea,打開項(xiàng)目,在gceasy.io網(wǎng)站上分析垃圾收集日志, 可以看到幾個常用的指標(biāo):
新生代,老年代分配的空間,以及使用的內(nèi)存峰值

image
吞吐量及暫停時間:
- 吞吐量:吞吐量是指應(yīng)用程序線程用時占程序總用時的比例
- 暫停時間:指一個時間段內(nèi)應(yīng)用程序線程讓與 GC 線程執(zhí)行而完全暫停。

image
- 換一下垃圾收集器試試
-XX:+UseG1GC
看起來吞吐量也降低了,暫停時間也增加了。

image

image
- 新增一個GC參數(shù),最大的停頓時間為50ms,這個參數(shù)
這個參數(shù)不是硬性要求,JVM只是會盡最大的努力來達(dá)到這個要求,但是還是可能超過這個值
-XX:MaxGCPauseMillis=50
貌似沒啥變化,就不貼圖了
新增參數(shù),初始堆占用百分比:
-XX:InitiatingHeapOccupancyPercent=50
看起來效果也不是特別好

image
增加垃圾收集器的并發(fā)線程數(shù):,效果反而更差了。
-XX:ParallelGCThreads=20 //設(shè)置并行回收時GC的線程數(shù)
-XX:ConcGCThreads=5
G1的垃圾收集器階段:
- 初始標(biāo)記
- 并發(fā)標(biāo)記
- 最終標(biāo)記
- 篩選回收
- 用一下CMS垃圾收集器看看
-XX:+UseConcMarkSweepGC
效果好些還是不如最初的狀態(tài)

image
- 我們還是用最開始的垃圾收集器組合吧。

image
-XX:+UseParallelGC
最后
對JVM這塊不夠大的指標(biāo)就看吞吐量和暫停時間,更細(xì)的指標(biāo)需要大家一起探索