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

解決 Java OutOfMemoryError:Tomcat 三大部署場景實戰指南

     編輯:Java 相關知識

在 Java 開發中,OutOfMemoryError 是讓許多開發者頭痛的經典錯誤。特別是當應用部署在 Tomcat 上時,不同的啟動方式導致配置位置各異,稍有不慎就會陷入「改了配置卻不生效」的泥沼。本文將針對三種常見的 Tomcat 部署場景,提供經過實測驗證的 JVM 參數調優方案,助你徹底解決記憶體溢出問題。

核心參數速查

  • -Xms / -Xmx:設定 Java 堆的初始大小與最大大小,解決 Java Heap Space 不足。
  • -XX:PermSize / -XX:MaxPermSize(Java 8 之前):設定永久代初始/最大大小,解決 PermGen Space 不足(類載入過多導致)。
  • 註:Java 8 起永久代被元空間取代,參數改為 -XX:MetaspaceSize 與 -XX:MaxMetaspaceSize。

場景一:Eclipse 內嵌 Tomcat

在 Eclipse 中通過 Servers 視圖配置 Tomcat 時,雙擊伺服器打開概覽頁,點選 Open launch configuration → Arguments 標籤 → VM arguments 區域,直接添加:

-Xms512M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=512M

此法最直觀,修改後重啟伺服器即可生效。

場景二:直接執行 startup.bat / catalina.bat

若專案直接放入 webapps 並用腳本啟動,需編輯 bin/catalina.bat(Linux 下為 catalina.sh)。找到以下兩行:

rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"

在這兩行 之前 插入(位置關鍵,且引號不可漏):

set "JAVA_OPTS=-Xms512M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=512M"

保存後重新執行 startup.bat 即可。

場景三:Tomcat 註冊為 Windows 服務

此模式下 Tomcat 讀取的是註冊表而非批次檔參數,修改 catalina.bat 無效。解決步驟:

  1. 執行 bin/tomcat7w.exe(或 tomcat8w.exe、tomcat9w.exe)。
  2. 切換到 Java 標籤:
    • Initial memory pool → 初始堆(如 512)
    • Maximum memory pool → 最大堆(如 1024)
  3. 在 Java Options 文字框中 每行一項、行首無空格 添加:
-Dcatalina.base=%tomcat_home%
-Dcatalina.home=%tomcat_home%
-Djava.endorsed.dirs=%tomcat_home%\endorsed
-Djava.io.tmpdir=%tomcat_home%\temp
-XX:PermSize=256M
-XX:MaxPermSize=256M
-XX:ReservedCodeCacheSize=48M
-Duser.timezone=GMT+08

點擊 Apply 後重啟服務即可生效。

避坑指南:如何確認真的是 OOM?

  • Eclipse Console / startup.bat 啟動:控制台會直接拋出 OutOfMemoryError 堆疊追蹤,一眼可辨。
  • Windows 服務模式:無任何錯誤輸出!應用會卡在「啟動中」,響應極慢,極易誤判為資料庫或網路問題。此時請檢查 Windows 事件檢視器 → Application 日誌,或臨時改用 startup.bat 觀察控制台輸出。

總結:參數調優本身不難,難點在於找對配置入口與準確判斷錯誤類型。希望這三大場景的實戰經驗能為你節省寶貴的排查時間。

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