freemarker導致記憶體洩露問題分析排查
阿新 • • 發佈:2022-04-07
z說明
測試環境出現非常慢,測試說執行過工單word匯出就出現這種問題
排查步驟
1.檢視機器cpu和記憶體 正常
2.排查gc回收 發現一隻在觸發full gc
jstat -gc 10755
3.dump堆資訊進行分析
jmap -dump:format=b,file=/Users/liqiang/Desktop/logs/heap.hprof pid
4.先通過Vm檢視
根據大物件名字看不出什麼問題
5.使用MAT 匯入dump檔案進行分析
6.前面3個都是相同的堆疊看業務程式碼是匯出 高度嫌疑
7.點選Details當前執行執行緒執行引用的物件資訊
可以發現freemarker.core.SimpleCharStream 為大物件類
8.可以通過右鍵檢視當時物件的引用資訊和成員變數資訊
9.一般檢視記憶體洩露都是看引用refrences
可以看出源頭是template 的parser引用tokenSource ....
10.MAT我感覺不直觀可以使用VM
11.跟原始碼發現parse在初始化後就置空了銷燬了,理論上垃圾回收期會回收
12.看執行緒堆疊確實是在template 建構函式觸發的大物件佔用得不到釋放
13.最後根據業務程式碼定位到 呼叫了2次fremakker渲染
14.最後懷疑是不是第一次已經填充了資料,整個結果非常大 因為含有圖片。圖片針對word匯出是填充的圖片的base64的資料
第二次根據第二次的結果再進行渲染因為太大 導致異常在template卡死
優化後釋出可以正常匯出了