記一次JVM調(diào)優(yōu)

調(diào)優(yōu)參考:https://developer.aliyun.com/article/690392

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

能夠有效通過 JVM 調(diào)優(yōu)提升系統(tǒng)性能的人往往被人們冠以”大牛”、”大師”之類的稱呼。

過程

  1. 在項(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
  1. 新生代,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ì)介紹

  1. 啟動idea,打開項(xiàng)目,在gceasy.io網(wǎng)站上分析垃圾收集日志, 可以看到幾個常用的指標(biāo):

新生代,老年代分配的空間,以及使用的內(nèi)存峰值


image

吞吐量及暫停時間:

  • 吞吐量:吞吐量是指應(yīng)用程序線程用時占程序總用時的比例
  • 暫停時間:指一個時間段內(nèi)應(yīng)用程序線程讓與 GC 線程執(zhí)行而完全暫停。
image
  1. 換一下垃圾收集器試試
-XX:+UseG1GC

看起來吞吐量也降低了,暫停時間也增加了。


image
image
  1. 新增一個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)記
  • 篩選回收
  1. 用一下CMS垃圾收集器看看
-XX:+UseConcMarkSweepGC

效果好些還是不如最初的狀態(tài)

image
  1. 我們還是用最開始的垃圾收集器組合吧。
image
-XX:+UseParallelGC

最后

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 虛擬機(jī)有自己完善的硬件架構(gòu), 如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,751評論 0 10
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時不同JDK版本的...
    高廣超閱讀 16,056評論 3 83
  • 工作之余,想總結(jié)一下JVM相關(guān)知識。 Java運(yùn)行時數(shù)據(jù)區(qū): Java虛擬機(jī)在執(zhí)行Java程序的過程中會將其管理的...
    Huang遠(yuǎn)閱讀 683評論 0 2
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
    簡欲明心閱讀 90,379評論 17 311
  • 原文閱讀 前言 這段時間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點(diǎn)贊,這博客我...
    碼農(nóng)戲碼閱讀 6,157評論 2 31

友情鏈接更多精彩內(nèi)容