俗話說技多不壓身,當年苦讀《深入理解 JVM》並整理筆記,如今終派上用場。筆記參考:https://www.cnblogs.com/syjkfind/p/3901774.html
用戶操作數據導出時頻繁卡頓,後台大內存定時任務觸發時同樣發生。JVM 參數屬於常規合理配置。
-XX:+DisableExplicitGC 禁用。-XX:SurvivorRatio=32 # 單個 Survivor 佔年輕代 1/34
-XX:OldSize=60M # 老年代初始大小
-XX:MaxTenuringThreshold=15 # 經歷 15 次 Minor GC 仍存活則晉升老年代
-XX:CMSInitiatingOccupancyFraction=80 # 老年代 80% 觸發 CMS
-XX:+UseCMSCompactAtFullCollection # Full GC 時壓縮碎片
-XX:CMSFullGCsBeforeCompaction=5 # 每 5 次 Full GC 壓縮一次
-XX:-OmitStackTraceInFastThrow 導致重複異常生成完整堆棧,佔用大量臨時對象。需權衡調試需求與 GC 壓力。調優參數可緩解症狀,但代碼設計才是根源:缺乏多級緩存、萬條數據無分頁全載入、隱藏切面塞滿異步隊列。初期享受框架便利忽視設計,如今需償還技術債。
短期內加機器、剝離大任務最見效;中長期應:整理異常體系、強制業務分頁、封裝分頁查詢框架、引入二級集群緩存。長遠看須回歸 Spring 主流棧、邁向服務化,但那意味著重寫業務代碼。
若堅持調優,建議 Dump 堆深度分析。主觀上啟用快拋、Full GC 後碎片整理、增大 Survivor較有針對性;CMSInitiatingOccupancyFraction 等精細參數需量化分析後再定。