首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Tomcat/JVM 記憶體溢出異常排查與優化實戰

     編輯:Java 相關知識

現象描述

系統在周一早上發布升級後,半夜兩點 Tomcat 突然掛掉。白天高負載運行正常,卻在深夜低流量時發生 OutOfMemoryError。日誌分析顯示兩類錯誤反覆出現:

  1. JSP 檔案被誤刪導致登入頁面持續拋異常(意味著一天無人登入)
  2. 舊式 JSP param 用法缺乏異常處理,資料型別錯誤反覆輸出

推測:頻繁異常導致大量臨時物件產生,GC 來不及回收,最終堆積耗盡記憶體。但白天高負載卻未崩潰,原因仍待深究。

解決方案

1. 擴大 JVM 堆記憶體

參考 Sun HotSpot GC 文檔,調整啟動參數:

-Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m

具體數值視伺服器物理記憶體與應用特性而定。

2. 徹底清除程式碼缺陷

  • 恢復被誤刪的共用 JSP 檔案
  • 補全舊式 JSP 參數處理的異常捕獲與型別檢查
  • 加強發布前的回歸測試,特別是共用元件變更

3. 監控與預警機制

  • 啟用 GC 日誌:-Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
  • 部署監控工具(如 VisualVM、JConsole、Prometheus+Grafana)監控堆使用率
  • 設定記憶體使用率閾值告警(如超過 85% 觸發通知)

深度思考

白天高負載不崩、夜間低負載崩潰,提示我們:

  • 異常頻率與 GC 壓力的非線性關係
  • Young GC 與 Full GC 觸發條件的差異
  • 應用層面的「錯誤風暴」比單純流量衝擊更隱蔽

記憶體調優非一次性工作,需建立「監控→分析→調優→驗證」的持續迴路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved