解決一個線上頻繁YGC的問題

問題描述:

   線上服務頻繁YGC最嚴重的時候1s一次

pod信息  -Xms1712m -Xmx1712m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxxxx/ -Docr.consumer.closed=true -XX:+PrintGCDetails -Xloggc:/xxxxxx/gc.log

GC日誌如下:

143801.494: [GC (Allocation Failure) [PSYoungGen: 579584K->480K(581120K)] 728931K->150492K(1750016K), 0.0039592 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
143804.524: [GC (Allocation Failure) [PSYoungGen: 579037K->305K(581632K)] 729050K->150357K(1750528K), 0.0037709 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
143808.399: [GC (Allocation Failure) [PSYoungGen: 579377K->320K(581632K)] 729429K->150420K(1750528K), 0.0035795 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
143811.813: [GC (Allocation Failure) [PSYoungGen: 579392K->480K(581632K)] 729492K->150620K(1750528K), 0.0037599 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
143814.931: [GC (Allocation Failure) [PSYoungGen: 579552K->1120K(581632K)] 729692K->151389K(1750528K), 0.0039675 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
143818.447: [GC (Allocation Failure) [PSYoungGen: 580192K->1056K(581632K)] 730461K->152070K(1750528K), 0.0043281 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
143821.569: [GC (Allocation Failure) [PSYoungGen: 580128K->1104K(581632K)] 731142K->152495K(1750528K), 0.0040286 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
143824.782: [GC (Allocation Failure) [PSYoungGen: 580176K->2560K(579584K)] 731567K->156034K(1748480K), 0.0051094 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
143828.300: [GC (Allocation Failure) [PSYoungGen: 579584K->608K(580608K)] 733058K->156302K(1749504K), 0.0043955 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
143832.123: [GC (Allocation Failure) [PSYoungGen: 577632K->640K(580608K)] 733326K->156398K(1749504K), 0.0041306 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
143836.544: [GC (Allocation Failure) [PSYoungGen: 577664K->704K(580608K)] 733422K->156526K(1749504K), 0.0038939 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
143840.768: [GC (Allocation Failure) [PSYoungGen: 577728K->512K(581120K)] 733550K->156398K(1750016K), 0.0082277 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

當發現問題之後,迅速連上服務器看pod情況,發現pod頻繁重啓。查看日誌沒發現任何問題,感覺很詭異。

然後使用arthas查看內存使用情況:

上圖中的 ps區域和metaspace都使用快滿了,然後使用heapdump命令把heap dump下來。傳輸到本地

使用 jdk自帶的Java VisualVM導入hprof 文件 發現結果如下:

發現 int[]數組實例數雖然不是最多,但是佔用的空間最大,另一個就是byte[]佔用的也多。但內存佔用的比int[]數組要少很多。

然後就把服務的代碼找出來,一直在想什麼操作會讓int[]數組很多。在實際的開發任務裏是不會使用int[]數組的。沒發現明顯的問題

使用JProfiler工具,導入dump出來的文件,查看對象

剛開始沒有想到char[]數組的問題,還在查找int[]數組,一直在走彎路。

看到上圖的錯誤信息後,啓動本地服務,使用JProfiler監控本地JVM。發現每次請求任意接口,內存都會很快的增長

上圖發現是redis導致的,然後排查redis的連接配置,發現是redis使用的有問題

然後改一下配置,就沒有再重現了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章