JVM調優

記一次JVM調優

高級程序員必不可少的技能,這個也是高薪必問的問題javascript

可以有效經過 JVM 調優提高系統性能的人每每被人們冠以」大牛」、」大師」之類的稱呼。css

過程

  1. 在項目啓動時加上必要的參數
-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網站上,直接就給了提示,增長metaspace的大小,在參數設置中,咱們沒有看到設置metaspace,那麼下面一步作調整。html

  1. 新生代,MetaSpace不夠用,增長以下參數
    初始堆內存與最大堆內存大小設爲一致,這樣虛擬機一次性的分配內存,而不至於在初始堆大小不夠用又向系統分配內存
-Xmx2048m -Xms2048m -Xmn1024m -XX:MetaspaceSize=512m

此次參數變動爲以下:java

-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文檔查看詳細介紹程序員

  1. 啓動idea,打開項目,在gceasy.io網站上分析垃圾收集日誌, 能夠看到幾個經常使用的指標:

新生代,老年代分配的空間,以及使用的內存峯值
併發

吞吐量及暫停時間:oracle

  • 吞吐量:吞吐量是指應用程序線程用時佔程序總用時的比例
  • 暫停時間:指一個時間段內應用程序線程讓與 GC 線程執行而徹底暫停。

  1. 換一下垃圾收集器試試
-XX:+UseG1GC

看起來吞吐量也下降了,暫停時間也增長了。
ide

  1. 新增一個GC參數,最大的停頓時間爲50ms,這個參數

這個參數不是硬性要求,JVM只是會盡最大的努力來達到這個要求,可是仍是可能超過這個值性能

-XX:MaxGCPauseMillis=50

貌似沒啥變化,就不貼圖了
新增參數,初始堆佔用百分比:網站

-XX:InitiatingHeapOccupancyPercent=50

看起來效果也不是特別好

增長垃圾收集器的併發線程數:,效果反而更差了。

-XX:ParallelGCThreads=20 //設置並行回收時GC的線程數 -XX:ConcGCThreads=5

G1的垃圾收集器階段:

  • 初始標記
  • 併發標記
  • 最終標記
  • 篩選回收
  1. 用一下CMS垃圾收集器看看
-XX:+UseConcMarkSweepGC

效果好些仍是不如最初的狀態

  1. 咱們仍是用最開始的垃圾收集器組合吧。

-XX:+UseParallelGC

最後

對JVM這塊不夠大的指標就看吞吐量和暫停時間,更細的指標須要你們一塊兒探索

相關文章
相關標籤/搜索