Often time, Tomcat may hits the following
java.lang.OutOfMemoryError: PermGen space
error.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)
It’s usually happened after the Tomcat restarts a few times.
1. Solution
By default, Tomcat is assigned a very little PermGen memory for the running process. To fix it, increase the PermGen memory settings by using the following Java VM options.
In eclipse by default it is 256 MB. You can increase it by your need. If you are use eclipse then set this value in "eclipse.ini" initialization file.
-XX:PermSize<size> - Set initial PermGen Size. -XX:MaxPermSize<size> - Set the maximum PermGen Size.
In the next step, we will show you how to set the VM options in Tomcat, under Windows and Linux environment.
2. Windows
Tomcat is managed by this script file
catalina.bat
, dive inside the script, you will find out thatcatalina.bat
always find and run the setenv.bat
file to set the environment variables.
{$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 //...
2.1 To set the environment variable on Windows, create a
setenv.bat
manually, and put it into the${tomcat-folder}\bin
folder.
${tomcat-folder}\bin\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
On Linux, the process is same, just Tomcat is using
catalina.sh
and setenv.sh
instead.
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/mkyong/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}\bin\
folder.
${tomcat-folder}\bin\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
The heap size and non-heap size (perm gen) value is just an example, you should change the value accordingly to suit your project needs.
The heap size and non-heap size (perm gen) value is just an example, you should change the value accordingly to suit your project needs.
* Original post on mkyong.com