Tomcat 7出现java.lang.OutOfMemoryError: PermGen space解决方法
特不靠谱 2020-09-16 21:58:06 1257人已围观
第一、原因分析:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用会加载LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对程序进行预编译的时候。
第二、解决方法:
手动设置MaxPermSize大小:
修改TOMCAT_HOME/bin/catalina.bat(windows系统)或者catalina.sh(linux系统),文件非注释第一行,位置cygwin=false前,手动添加一行(注意引号要带上),我以linux设置截图为例:
1.windows系统 在 TOMCAT_HOME/bin/catalina.bat 文件 echo Using CATALINA_BASE: "%CATALINA_BASE%"上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m
2.linux系统 在 catalina.sh 文件 文件非注释第一行,位置cygwin=false前,手动添加一行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true "
文件位置:
修改代码:
如果改完后不正常执行./shutdown.sh 会报错:
[root@root bin]# ./shutdown.sh Using CATALINA_BASE: /usr/www.onekbit.com/tomcat Using CATALINA_HOME: /usr/www.onekbit.com/tomcat Using CATALINA_TMPDIR: /usr/www.onekbit.com/tomcat/temp Using JRE_HOME: /usr/www.onekbit.com/jdk/jre Using CLASSPATH: /usr/www.onekbit.com/tomcat/bin/bootstrap.jar:/usr/www.onekbit.com/tomcat/bin/tomcat-juli.jar Usage: catalina.sh ( commands ... ) commands: debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window run -security Start in the current window with security manager start Start Catalina in a separate window start -security Start in a separate window with security manager stop Stop Catalina, waiting up to 5 seconds for the process to end stop n Stop Catalina, waiting up to n seconds for the process to end stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running configtest Run a basic syntax check on server.xml - check exit code for result version What version of tomcat are you running? Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined
第三、JVM启动模式简介
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机,而虚拟机JVM主要有 Server模式与client模式两种启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。JVM工作在Server模式下可以大大提高性能,Server模式下应用的启动速度会比client模式慢大概10%,但运行速度比Client VM要快至少有10倍。server:启动慢,编译更完全,编译器是自适应编译器,效率高,针对服务端应用优化,在服务器环境中最大化程序执行速度而设计。client:快速启动,内存占用少,编译快,针对桌面应用程序优化,为在客户端环境中减少启动时间而优化;
当不指定运行模式参数时,虚拟机启动检测主机是否为服务器,如果是,则以Server模式启动,否则以client模式启动,J2SE5.0检测的根据是至少2个CPU和最低2GB内存,由于服务器的CPU、内存和硬盘都比客户端机器强大,所以程序部署后,都应该以server模式启动,获取较好的性能;JVM在client模式默认-Xms是1M,-Xmx是64M;JVM在Server模式默认-Xms是128M,-Xmx是1024M;
我们可以通过运行:java -version来查看jvm默认工作在什么模式。如下图:
这里就是以server模式启动的。
第四、设置建议:
-server : 以server模式启动
-vmargs:说明后面是VM的参数
-Xms:JVM堆内存的初始大小,默认是物理内存的1/64
-Xmx:JVM堆内存的最大内存,默认是物理内存的1/4,一般建议堆的最大内存设置为可用内存的最大值的80%;
-Xmn:新生代内存大小,官方建议是整个堆的3/8;
-XX:PermSize:设置持久代(Perm gen)初始大小。默认是物理内存的1/64;一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置
-XX:MaxPermSize:设置持久代(Perm gen)最大值大小,默认是物理内存的1/4。这个也适当大些
-XX:newSize:表示新生代初始内存的大小,应该小于-Xms的值;
-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于-Xmx的值;
其中一个很重的要的知识点就是:
(1)、 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.
(2)、通常会将-Xms 与-Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
我这里使用的是tomcat7.0.59版本。
参考文档:
1、http://www.360doc.com/content/14/0814/15/16493677_401816839.shtml