Tomcat - java.lang.OutOfMemoryError: пространство PermGen

Tomcat - java.lang.OutOfMemoryError: пространство PermGen

Часто Tomcat может обнаруживать следующую ошибкуjava.lang.OutOfMemoryError: PermGen space.

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.

1. Решение

По умолчанию Tomcat выделяется очень мало памяти PermGen для запущенного процесса. Чтобы исправить это, увеличьте параметры памяти PermGen, используя следующие параметры виртуальной машины Java.

-XX:PermSize - Set initial PermGen Size.
-XX:MaxPermSize - Set the maximum PermGen Size.

На следующем шаге мы покажем вам, как установить параметры виртуальной машины в Tomcat в среде Windows и Linux.

2. Windows

Tomcat управляется этим файлом сценарияcatalina.bat, погрузившись в сценарий, вы обнаружите, чтоcatalina.bat всегда находит и запускает файлsetenv.bat для установки переменных среды.

\{$tomcat-folder}in\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
//...

2.1 To set the environment variable on Windows, create a setenv.bat manually, and put it into the ${tomcat-folder}in folder.

${tomcat-folder}in\setenv.bat

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

P.S No double quotes, set JAVA_OPTS={value}.

2.2 Restart Tomcat, it will call the setenv.bat file to set the environment variable automatically.

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

3. Linux

В Linux процесс такой же, только Tomcat использует вместо нихcatalina.sh иsetenv.sh.

3.1 Find out where is catalina.sh :

catalina.sh

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

3.2 Review the catalina.sh, script, it behaves like Windows, but use setenv.sh instead.

//...
# 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
//...

3.3 Create a setenv.sh manually, and put it into the ${tomcat-folder}in\ folder.

${tomcat-folder}in\setenv.sh

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

P.S With double quotes, export JAVA_OPTS=”{value}”.

3.4 Restart Tomcat.

Note
Значение размера кучи и размера без кучи (perm gen) является лишь примером, вы должны изменить это значение в соответствии с потребностями вашего проекта.