在 Java 開發中,OutOfMemoryError 是讓許多開發者頭痛的經典錯誤。特別是當應用部署在 Tomcat 上時,不同的啟動方式導致配置位置各異,稍有不慎就會陷入「改了配置卻不生效」的泥沼。本文將針對三種常見的 Tomcat 部署場景,提供經過實測驗證的 JVM 參數調優方案,助你徹底解決記憶體溢出問題。
Java Heap Space 不足。PermGen Space 不足(類載入過多導致)。-XX:MetaspaceSize 與 -XX:MaxMetaspaceSize。在 Eclipse 中通過 Servers 視圖配置 Tomcat 時,雙擊伺服器打開概覽頁,點選 Open launch configuration → Arguments 標籤 → VM arguments 區域,直接添加:
-Xms512M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=512M
此法最直觀,修改後重啟伺服器即可生效。
若專案直接放入 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 讀取的是註冊表而非批次檔參數,修改 catalina.bat 無效。解決步驟:
bin/tomcat7w.exe(或 tomcat8w.exe、tomcat9w.exe)。-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 後重啟服務即可生效。
OutOfMemoryError 堆疊追蹤,一眼可辨。startup.bat 觀察控制台輸出。總結:參數調優本身不難,難點在於找對配置入口與準確判斷錯誤類型。希望這三大場景的實戰經驗能為你節省寶貴的排查時間。