Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Tomcat 記憶體溢出 (OOM) 診斷與臨時緩解方案

編輯:Linux 教學

現象描述

Tomcat 進程仍存活,但 Web 頁面無回應。檢查日誌 logs/localhost.yyyy-mm-dd.log 發現大量 java.lang.OutOfMemoryError: Java heap space。

堆疊追蹤關鍵點

at com.jiuxing.website.control.Control.service(Control.java:54)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:728)
at com.jiuxing.website.filters.SetCharacterEncodingFilter.doFilter(...)

錯誤發生於 Servlet 轉發與過濾器鏈,提示 Heap 空間耗盡。

臨時緩解:調大 Heap 上限

編輯 bin/catalina.sh (Linux) 或 bin/catalina.bat (Windows),調整 JAVA_OPTS:

# 原設定
JAVA_OPTS="-Xms512m -Xmx512m ..."

# 修改為
JAVA_OPTS="-Xms1024m -Xmx1024m ..."
# 或針對 64 位 JVM 可再調大,如 -Xmx2048m / -Xmx4096m

重啟 Tomcat 生效:./shutdown.sh && ./startup.sh。

根因分析與永久解決方向

可能原因排查與解決
記憶體洩漏用 jmap -histo:live pid、jhat、Eclipse MAT 分析 Heap Dump,找出未釋放物件(如靜態集合、ThreadLocal、連線池洩漏)。
單次請求佔用過大檢查大報表匯出、大檔案上傳、Base64 編碼大圖片等場景,改用串流處理、分頁查詢。
連線池/執行緒池配置過大調整 server.xml maxThreads、資料庫連線池 maxActive,避免同時佔用過多 Heap。
PermGen / Metaspace 耗盡JDK 8+ 關注 MaxMetaspaceSize;大量動態類載入 (JSP、Spring CGLIB) 需調大。
GC 策略不當觀察 GC 日誌 (-Xlog:gc*),調整新生代/老年代比例、切換 G1/ZGC 等低延遲收集器。

監控與預警建議

  • 啟用 JMX / Prometheus JMX Exporter 抓取 java.lang:type=Memory 指標。
  • 設定 Heap 使用率 > 80% 告警,提前發現趨勢。
  • 定期產出 Heap Dump 基準線:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path。

總結

調大 -Xmx 只能暫時緩解,必須結合 Heap Dump 分析、程式碼審查、GC 調優 才能徹底解決 OOM。建議建立「監控 → 告警 → 分析 → 修復 → 驗證」閉環機制。

Copyright © Windows教程網 All Rights Reserved