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) является лишь примером, вы должны изменить это значение в соответствии с потребностями вашего проекта.