Tomcat - java.lang.OutOfMemoryError: espace PermGen

Tomcat - java.lang.OutOfMemoryError: espace PermGen

Souvent, Tomcat peut rencontrer l'erreurjava.lang.OutOfMemoryError: PermGen space suivante.

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)

Cela se produit généralement après le redémarrage du Tomcat à quelques reprises.

1. Solution

Par défaut, Tomcat se voit attribuer une très petite mémoire PermGen pour le processus en cours. Pour résoudre ce problème, augmentez les paramètres de mémoire PermGen à l'aide des options Java VM suivantes.

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

Dans l'étape suivante, nous vous montrerons comment définir les options de VM dans Tomcat, sous environnement Windows et Linux.

2. les fenêtres

Tomcat est géré par ce fichier scriptcatalina.bat, plongez dans le script, vous découvrirez quecatalina.bat trouve et exécute toujours le fichiersetenv.bat pour définir les variables d'environnement.

\{$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

Sous Linux, le processus est le même, seul Tomcat utilisecatalina.sh etsetenv.sh à la place.

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
La valeur de la taille du tas et de la taille non-tas (perm gen) est juste un exemple, vous devriez changer la valeur en conséquence pour répondre aux besoins de votre projet.