通常,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内存用于正在运行的进程。 要解决此问题,请使用以下Java VM选项增加PermGen内存设置。
-XX:PermSize<size> - Set initial PermGen Size.
-XX:MaxPermSize<size> - Set the maximum PermGen Size.
在下一步中,我们将向您展示如何在Windows和Linux环境下的Tomcat中设置VM选项。
2. Windows
Tomcat由此脚本文件catalina.bat
管理, catalina.bat
该脚本内,您会发现catalina.bat
始终会找到并运行setenv.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要在Windows上设置环境变量,请手动创建setenv.bat
,并将其放入${tomcat-folder}\bin
文件夹中。
set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m
PS没有双引号,请设置JAVA_OPTS = {value}。
2.2重新启动Tomcat,它将调用setenv.bat
文件来自动设置环境变量。
{$tomcat-folder}\bin\catalina.bat restart
3. Linux
在Linux上,过程是相同的,只是Tomcat使用catalina.sh
和setenv.sh
代替。
3.1找出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查看catalina.sh
脚本,其行为类似于Windows,但请使用setenv.sh
。
//...
# 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手动创建一个setenv.sh
,并将其放入${tomcat-folder}\bin\
文件夹中。
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m"
PS带双引号,导出JAVA_OPTS =” {value}”。
3.4重新启动Tomcat。
注意
堆大小和非堆大小(perm gen)值只是一个例子,您应该相应地更改该值以适合您的项目需求。
参考文献
翻译自: https://mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/