一次線上JVM FullGC 問題的查找

一、問題

線上服務出現響應變慢好像掛了的問題,登上服務器查看 top,查看到java進程cpu 100%

mem佔用很高。用 jstat -gcutil 23658 1000 查看,發線jvm在做fullgc,於是馬上修改nginx切換到備用服務上。

二、查找問題

FullGC問題說明內存不夠了,馬上用 jmap -dump:live,format=b,file=dump.hprof 23658 導出內存dump文件,在用 jmap -histo 23658 查看內存內對象統計計數如下:

一次線上JVM FullGC 問題的查找

#instance 是對象的實例個數#bytes 是總佔用的字節數class name 對應的就是 Class 文件裡的 class 的標識B 代表 byteC 代表 charD 代表 doubleF 代表 floatI 代表 intJ 代表 longZ 代表 boolean前邊有 [ 代表數組, [I 就相當於 int[]對象用 [L+ 類名錶示

發現 char[]佔用過多 往往跟String有關,String其內部使用final char[]數組來保存數據的。但還是看不出來是那個代碼導致佔用內存這麼高。於是只能使用之前導出的dump文件來分析了。

導出的文件大概有4.5G .最開始下了一個IBM HeapAnalyzer 導入4.5G文件始終導入不進去太大了。於是想到java自帶的jhat,在本地用 jhat -J -Xmx1024M dump.hprof ,還是始終一直處於加載中。後面又把文件傳到服務器上 終於使用了15G的Xmx才導入進去,打開web監控頁面發現查詢太慢了根本不能使用。於是又在往上搜索到了JProfiler,這個挺快的4.5G文件一下就導入進去了。

如下:選擇

一次線上JVM FullGC 問題的查找

右鍵 第一行 如下,選擇References-> Incoming references

一次線上JVM FullGC 問題的查找

出來的圖展開就可以看到調用的代碼了。

參考文章如下:

https://blog.csdn.net/fenglibing/article/details/6411953

https://www.cnblogs.com/kongzhongqijing/articles/3621163.html


分享到:


相關文章: