omjava.lang.OutOfMemoryError: PermGen space解决方法

参考资料
1 spring java.lang.OutOfMemoryError: PermGen space
http://hi.baidu.com/xjh0501/blog/item/a3d45b3b86309d28b8998f89.html
2 分析java.lang.OutOfMemoryError: PermGen space
http://www.iteye.com/topic/80620
3 bea jrockit的确是个生产应用的好平台
http://www.iteye.com/topic/148887
4 有兄弟使用过BEA的jrockit吗?
http://www.iteye.com/topic/235203
5 Linux平台的JVM性能评测
http://www.iteye.com/topic/5322

开发环境: Tomcat7+SUN JDK1.6出现这个问题,重启后等一会就要报这个错误!
换成:Tomcat6+BEA(SUN JDK1.5)一直没问题,还是不要用太高版本了呀!


引用文:
发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。

但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生。

于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!
2003年的时候就有一个bug报告给sun,但是到现在,这个bug还没有close!有人在这个bug加了句评语:“A bug this critical is open since 2003? Absolutely shameful.” 我觉得SUN在这个BUG上确实有些丢脸。对这个bug最彻底的解决办法就是不要用SUN的JDK,而改用BEA的 JRokit. 打不过,还逃不过吗? 有众多的选择,这就是开源的好。 :)


总结如下:

1 修改jvm参数

-Xms 启动应用时,JVM堆空间的初始大小值。
-Xmx 应用运行中,JVM堆空间的极限值。为了不消耗扩大JVM堆控件分配的开销,将此参数和-      Xms这个两个值设为相等,考虑到需要开线程,将此值设置为总内存的80%.
-Xmn 此参数硬性规定堆空间的新生代空间大小,推荐设为堆空间大小的1/4。
永久存储区参数:
-XX:PermSize 应用服务器启动时,永久存储区的初始内存大
-XX:MaxPermSize 应用运行中,永久存储区的极限值。为了不消耗扩大JVM永久存储区分配   的开销,将此参数和-XX:PermSize这个两个值设为相等。
1G内存环境下java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
windows下修改tomcat参数,方法一:
修改Catalina.bat文件
        在“rem Execute Java with the applicable properties ”以下每行(共四处)
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JA
VA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%"
-Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCL
ASS% %CMD_LINE_ARGS% %ACTION%
中的%CATALINA_OPTS% 替换成-Xms800m -Xmx800m -XX:PermSize=128m -XX:MaxNewSize=256m -XX:MaxPermSize=128m

2 对这个bug最彻底的解决办法就是不要用SUN的JDK,而改用BEA的 JRokit.

你可能感兴趣的:(spring,jvm,tomcat,ITeye,sun)