在vps上部署多个应用时,报了
java.lang.OutOfMemoryError: PermGen space
错误,由于没有深入了解过jvm,只能在网上搜到了一些解决办法。
简述
java.lang.OutOfMemoryError: PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决办法
这里以windows下tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。
1. MyEclipse/eclipse 中报 PermGen space。
window–>preferences–>Myclipse–>Servers–>Tomcat–>JDK,设置jdk参数。
-Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
**参数介绍:**
-Xms512m #JVM初始分配的堆内存
-Xmx1024m #JVM最大允许分配的堆内存,按需分配
-XX:PermSize=128M #JVM初始分配的非堆内存
-XX:MaxPermSize=256M #JVM最大允许分配的非堆内存,按需分配
- 手动设置MaxPermSize大小,如果是linux系统,修改
TOMCAT_HOME/bin/catalina.sh
,如果是windows系统,修改TOMCAT_HOME/bin/catalina.bat
,在
echo "Using CATALINA_BASE: $CATALINA_BASE"
上面加入以下行:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m"
**建议:将相同的第三方jar文件移置到tomcat/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。**
3. 在windows中,如果以服务方式启动,这个一般在服务器上用的比较多,修改注册表的数据。
找到 HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Procrun 2.0/Tomcat7/Parameters/Java
或HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Apache Software Foundation/Procrun 2.0/Tomcat7/Parameters/Java
,修改JvmMs和JvmMx的值。或者直接修改Options的参数,加入 -Xms512m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
之前还真不知道windows服务启动和startup.bat启动的区别。 windows服务器启动是在注册表中加载参数,startup.bat启动是在catalina.bat加载参数。
参考
http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html
http://www.cnblogs.com/xwdreamer/archive/2011/11/21/2296930.html