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

Tomcat 內存溢出排查與 JVM 參數調優完整指南

     編輯:Java 相關知識

常見 OOM 異常類型

1. PermGen Space(永久代溢出)

現象:java.lang.OutOfMemoryError: PermGen space

原因:JVM 永久代存儲 Class 元數據,默認較小(~64MB)。大量 JSP 編譯、第三方 JAR、熱部署導致類加載過多。

解決方案:

# Linux/Mac (catalina.sh)
JAVA_OPTS="-server -XX:PermSize=128M -XX:MaxPermSize=256M"

# Windows 服務模式:修改註冊表
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\\Parameters\Java
# 修改 JvmMs (初始堆) 和 JvmMx (最大堆)

最佳實踐:將公共 JAR 移至 tomcat/shared/lib 減少重複加載。

2. Java Heap Space(堆內存溢出)

現象:java.lang.OutOfMemoryError: Java heap space

原因:對象實例堆積、大對象分配、內存洩漏、GC 頻繁無效。

核心參數:

參數含義建議值
-Xms初始堆大小物理內存 1/4 ~ 1/2
-Xmx最大堆大小物理內存 1/2 ~ 3/4 (≤80%)
-Xmn新生代大小約 1/3 ~ 1/4 堆大小
-XX:SurvivorRatioEden/Survivor 比例默認 8:1:1

三種配置方式

方式一:修改 catalina.sh/bat(推薦)

# 在 echo "Using CATALINA_BASE..." 下方添加
JAVA_OPTS="-server -Xms2g -Xmx2g -Xmn512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"

方式二:環境變量 JAVA_OPTS

# Linux
export JAVA_OPTS="-Xms2g -Xmx2g"

# Windows 系統變量新增
JAVA_OPTS = -Xms2g -Xmx2g

方式三:tomcat9w.exe 圖形工具(Windows)

雙擊 bin\tomcat9w.exe → Java 頁籤 → 設置 Initial/Maximum memory pool → 重啟服務。

GC 調優核心原則

  • 堆大小 = 物理內存 80%,預留給 OS、元空間、線程棧
  • -Xms = -Xmx 避免動態擴縮容震蕩
  • Full GC 耗時 < 3-5 秒,否則縮小堆或調整代大小
  • 並行 GC:多核 CPU 開啟 -XX:+UseParallelGC 或 G1 -XX:+UseG1GC

避坑指南

  1. 最大堆超過物理可用內存 → Tomcat 啟動失敗
  2. 32 位 JVM 最大僅支持 ~1.5GB 堆
  3. 未配置 GC 日誌 → 無法事後分析:-Xlog:gc*:file=logs/gc.log:time,uptime:filecount=10,filesize=100m
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved