1. 程式人生 > 其它 >freemarker導致記憶體洩露問題分析排查

freemarker導致記憶體洩露問題分析排查

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卡死

優化後釋出可以正常匯出了