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

Tomcat 記憶體溢出 (OOM) 完整排查與 JVM 參數調優指南

     編輯:Java 綜合教學

常見 OOM 錯誤類型

  1. java.lang.OutOfMemoryError: Java heap space — 堆記憶體不足
  2. java.lang.OutOfMemoryError: PermGen space — 永久代記憶體不足 (JDK 8 後為 Metaspace)

JVM 記憶體模型基礎

  • Heap (堆):物件實例分配區,分 Young Generation (Eden + Survivor) 與 Old Generation
  • PermGen/Metaspace:類元資料、常量池、方法資訊存放區
  • 預設值:-Xms (初始堆) = 物理記憶體 1/64,-Xmx (最大堆) = 物理記憶體 1/4

解決方案一:調整 Heap 大小 (針對 Java heap space)

Linux 環境 (catalina.sh)

# 在 "echo \"Using CATALINA_BASE..." 之前新增
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

Windows 環境 (catalina.bat)

set JAVA_OPTS=-Xms128m -Xmx350m

注意:若以 Windows 服務啟動 Tomcat,catalina.bat 配置不生效,需修改註冊表:

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
# 原值後追加
-Xms300m -Xmx350m

參數建議

  • -Xms = -Xmx — 避免堆動態擴縮容震盪
  • -Xmn ≈ -Xmx 1/4 — 新生代大小
  • Heap 最大不超過物理記憶體 80%

解決方案二:調整 PermGen/Metaspace (針對 PermGen space)

原因分析

PermGen 存放類定義、元資料。JSP 編譯、Spring AOP (CGLIB 動態代理)、熱部署頻繁載入類易導致溢出。JDK 8 移除 PermGen 改用 Metaspace (Native Memory),參數改為 -XX:MetaspaceSize、-XX:MaxMetaspaceSize。

配置範例 (JDK 7/6)

# catalina.sh
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"

# catalina.bat
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

配置範例 (JDK 8+)

JAVA_OPTS="$JAVA_OPTS -server -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512m"

綜合調優範本 (1G 記憶體環境參考)

# Linux catalina.sh
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxPermSize=128m -XX:MaxNewSize=256m -Djava.awt.headless=true"

# 或保守配置
JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"
CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"

進階排查思路

  1. Heap Dump 分析:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path,用 MAT/Eclipse Memory Analyzer 分析
  2. GC 日誌:-Xloggc:/path/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
  3. 類洩漏檢查:關注動態代理、類載入器、ThreadLocal 洩漏
  4. 資料庫連線池:檢查連線洩漏導致物件堆積

避坑指南

  • ❌ 僅增大 -Xmx 不設 -Xms,導致啟動慢、GC 頻繁
  • ❌ Windows 服務模式修改 catalina.bat 以為生效
  • ❌ 忽略 Metaspace/PermGen,只調 Heap
  • ✅ 監控 GC 頻率與耗時,配合業務流量壓測驗證參數

總結

Tomcat OOM 核心在於 JVM 記憶體區域配置不足或應用存在洩漏。優先通過 JAVA_OPTS/CATALINA_OPTS 調整 Heap 與 PermGen/Metaspace 參數,區分 Linux/Windows 服務啟動方式差異;若調優無效,必須進行 Heap Dump 與 GC 日誌深度分析定位洩漏根因。

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