Tomcat – Java.Lang.OutOfMemoryError: PermGen Space

很多時候,在開發階段Tomcat重複的重啓過程中會遇到java.lang.OutOfMemoryError : PermGen space 錯誤。

1
2
3
4
java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

怎麼解決這種問題呢?

默認情況下,在程序運行中Tomcat只分配了非常小的PermGen內存, 因此需要增加PermGen內存,你可以通過下面的Java VM選項設置。


1
2
-XX:PermSize<size> - Set initial PermGen Size.
-XX:MaxPermSize<size> - Set the maximum PermGen Size.

換成Tomcat,該怎麼設置呢? 接下來告訴你如果在Windows和Linux環境下,通過Tomcat來設置這些VM選項。

Windows

Tomcat是由腳本catalina.bat來管理的。深入到腳本里面,你會發現catalina.bat會去查找並且運行setenv.bat文件。這個文件就是用來設置環境變量的。

1
2
3
4
5
6
7
8
9
10
//{$tomcat-folder}\bin\catalina.bat
//...
rem Get standard environment variables
if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
call "%CATALINA_BASE%\bin\setenv.bat"
goto setenvDone
:checkSetenvHome
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
:setenvDone
//...

在Windows中設置環境,你需要手工創建setenv.bat文件,然後把它放在${tomcat-folder}\bin 目錄下面。

1
2
//${tomcat-folder}\bin\setenv.bat
set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m

注意:這裏的JAVA_OPTS={value}沒有雙引號。

重啓tomcat,它會自動調用setenv.bat文件來設置這些環境變量。

1
{$tomcat-folder}\bin\catalina.bat restart

Linux

Linux平臺下原理是一樣的, 只是文件變成了catalina.sh 和 setenv.sh.

找到catalina.sh文件, 如果你不知道放在什麼目錄, 那麼全盤掃描一下:

1
2
3
4
5
6
catalina.sh
$ sudo find / -name "catalina.sh"
Password:
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/Users/mkyong/Downloads/apache-tomcat-6.0.35/bin/catalina.sh

你會看到和Windows下類似的代碼:

1
2
3
4
5
6
7
8
9
10
11
//...
# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=
 
if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi
//...

創建setenv.sh,把它放在${tomcat-folder}\bin\}目錄下, 文件的內容是:

1
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m"

注意:這裏和Windows有細微區別,這裏的value是有雙引號的export JAVA_OPTS=”{value}”。

重啓Tomcat。

注意:我這裏設置的Perm Gen大小僅僅是示例,你需要根據自己的項目需要來調整他們的值。

原文鏈接: mkyong 翻譯: ImportNew.com - 劉志軍
譯文鏈接: http://www.importnew.com/10427.html
[ 轉載請保留原文出處、譯者和譯文鏈接。]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章