1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        記一次不太成功的頻繁 full gc 排查過程

        共 2315字,需瀏覽 5分鐘

         ·

        2020-11-18 01:42

        上周自己負(fù)責(zé)的一個應(yīng)用出現(xiàn)頻繁full gc的問題,不得不嘗試優(yōu)化一下。第一次做這種事只能先看看網(wǎng)上的文章,然后親自嘗試怎么去完成減少full gc的頻率,降低young gc的頻率這一目標(biāo)。雖然最終只是勉強解決了,但還是希望記錄下來給下一次積攢經(jīng)驗。
        選取了上周優(yōu)化前后的兩個典型工作日上午9:00到晚上9:00的GC情況。優(yōu)化前一天要發(fā)生高達上10次的full gc,young gc也非常頻繁。優(yōu)化后的圖已經(jīng)沒有出現(xiàn)full gc,young gc的頻率也大大降低了,所以說基本完成目標(biāo)。
        接下來說明排查過程

        1.jps命令查看進程id

        jps是java后自帶的查看虛擬機進程狀態(tài)命令工具,用如下命令就可以看到虛擬機執(zhí)行主類和進程ID.
        jps -l

        2. jmap命令導(dǎo)出堆轉(zhuǎn)儲文件

        jmap是java自帶的內(nèi)存映像工具,能將當(dāng)前應(yīng)用運行內(nèi)存的情況導(dǎo)出為文件。注意格式,file后面是導(dǎo)出路徑,最后的數(shù)字為上一步得到的進程id。一般導(dǎo)出來的文件都比較大,我導(dǎo)出的有2.1G,而且進行分析也很耗性能,所以導(dǎo)出后都要傳輸?shù)狡渌鼨C器上進行分析,并且為了避免占用磁盤空間刪除本地文件。
        jmap -dump:format=b,file=kfwebHeap1016.hprof 35073

        3.mat工具分析堆轉(zhuǎn)儲文件

        mat是eclipse提供的堆轉(zhuǎn)儲文件分析工具,用mat打開mat上一步導(dǎo)出的文件,如下圖所示,可以看到總體內(nèi)存占用情況的扇形圖,哪個文件占用內(nèi)存最多就可以一目了然了。

        點擊histogram就可以看出各個對象的內(nèi)存占用情況,如下所示


        點擊Leak Suspects就可以給出最有可能發(fā)生內(nèi)存泄漏的幾種情況。能很好的幫助用戶進行內(nèi)存分析,這也是mat強大的重要體現(xiàn),如下:


        到這里應(yīng)該是最關(guān)鍵的環(huán)節(jié)了,可能因為沒有經(jīng)驗,看來看去也沒看出哪里不對,所以只能作罷,這條路已經(jīng)走不下去了,所以說這次分析不太成功。

        4.G1來了

        后來向一個老同事說明了我的情況,他問我用的什么垃圾回收器,我說用的是默認(rèn)的,年經(jīng)代用Parallel Scavenge,老年代用Parallel Old,他說讓我先換到G1試試吧。然后我查了一下,發(fā)現(xiàn)G1果然比較牛逼,雖然保留了以前的新生代Eden,Survivor和老年代的概念,但新生代和老年代不再物理隔離,而且它將內(nèi)存分為很多等大的region,每個region根據(jù)需要都有可能成為S(Surviror),E(Eden), O(Old)的一種,所以G1既能回收新生代也能回收老年代,它以垃圾回收為第一(這也是它名字的由來:Garbage First,G1)目標(biāo),勵志于取決CMS, 并且在java9是已經(jīng)是jdk默認(rèn)的垃圾回收器了。說了這么多,暫時沒有多時間深入研究,不管怎么樣還是值得一試的。于是在應(yīng)用的jvm啟動參數(shù)加了如下一行:
        -XX:+UseG1GC
        當(dāng)然只是在一臺機器上作了處理,也便于與其它機器作對比。

        5.MetaSpace調(diào)整

        通過調(diào)整后的這臺機器與其它機器對比,gc情況還是改善了不少,但是在查看gc日志時發(fā)現(xiàn)了這么這個頻繁出現(xiàn)的問題:
        Metadata GC Threshold
        由于元數(shù)據(jù)空間不足導(dǎo)致的GC.原來在G1中設(shè)置PermSize(永久代大小)已經(jīng)沒用了,取而代之的是MetaSpace參數(shù),雖然這個用的是并非堆內(nèi)存而是機器的物理內(nèi)存并且最大大小沒有限制,但是默認(rèn)初始大小只有20m,所以要作出調(diào)整:
        -XX:MetaspaceSize=128m
        加了之后果然就沒有出現(xiàn)這個問題了

        6. 解決Humongous Allocation

        在gc日志中還發(fā)現(xiàn)頻繁出現(xiàn):
        G1 Humongous Allocation
        這個是由于大型對象分配導(dǎo)致的問題,大型(Humongous)對象是指超過G1的Region 50%的內(nèi)存對象,頻繁大型對象內(nèi)存內(nèi)存分配會導(dǎo)致性能問題,而且如果一個region中大型對象過多的話則最后一個大型對內(nèi)象邊界和該region的邊界之間的空間將不會被使用,如果有多個這樣的region將會導(dǎo)致堆內(nèi)存的碎片化,在jdk1.8u40之前這些大型對象的清理在full gc期間進行完成。較新的jvm也是把大型對象放在清理階段,要解決上面的問題有兩種方法。
        1.增加region的大小(注意要在1到32m之間并且為2的整數(shù)次冪)
        2.增加堆內(nèi)存大小

        總結(jié):其實這一次只是引進了G1垃圾回收器并且對相關(guān)參數(shù)進行調(diào)整,但是促使我去了解jvm相關(guān)的知識和工具使用,還是有很很大收獲的

        作者:Acamy
        鏈接:https://www.jianshu.com/p/900d7376b8b1

        —————END—————

        更多精彩:
        Java實戰(zhàn)項目視頻,給需要的讀者,收藏!
        SpringBoot 如何上傳大文件?
        微信支付的軟件架構(gòu)到底有多牛?
        Java常用的幾個Json庫,性能強勢對比!
        求求你們了,別再寫滿屏的 if/ else 了!
        基于Spring+SpringMVC+Mybatis的分布式敏捷開發(fā)系統(tǒng)架構(gòu)(附源碼)

        關(guān)注公眾號,查看更多優(yōu)質(zhì)文章

        最近,整理一份Java資料Java從0到1,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
        獲取方式:關(guān)注公眾號并回復(fù)?Java?領(lǐng)取,更多Java內(nèi)容陸續(xù)奉上。
        明天見(??ω??)??

        瀏覽 77
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天堂A片| 亚洲AV无码精品黑人黑 | 99re6热精品免费视频网站 | 国产欧美日韩视频在线观看 | 日本伦理一区 | 医生别停啊摁摁h别进来 | 人妻无码AⅤ毛片A片麻豆 国产精品久久丫 | 91人妻人人澡人人爽人人 | AAA性爱 | 免费一级操逼片 |