renxiao2003 发表于 2011-12-21 08:44

分析java.lang.OutOfMemoryError: PermGen space

<DIV>
<a href="/blog/80620" target="_blank">分析java.lang.OutOfMemoryError: PermGen space</A>关键字: outofmemory, java, spring, tomcat, hibernate, cblib, jrokit
<DIV class=blog_content>SUN JDK+Tomcat 5.5.20运行服务的时候遇到问题,服务器跑几天后就会挂掉,并报java.lang.OutOfMemoryError: PermGen space异常。<BR><BR><BR>发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在<a href="http://forum.springframework.org/showthread.php?t=21383&amp;amp;highlight=cglib+cache" target="_blank">spring论坛</A>上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。<BR><BR>但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat在Q&amp;A很隐晦的回答了这一点,<a href="http://tomcat.apache.org/faq/deployment.html" target="_blank">我们知道这个问题,但这个问题是由一个更基础的问题产生。 </A><BR><BR><a href="http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space" target="_blank">于是有人对更基础的JVM做了检查</A>,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收! <BR><BR>2003年的时候就有一个<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4957990" target="_blank">bug</A>报告给sun,但是到现在,这个<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4957990" target="_blank">bug</A>还没有close!有人在这个bug加了句评语:“A bug this critical is open since 2003? Absolutely shameful.” 我觉得SUN在这个BUG上确实有些丢脸。<BR><BR>对这个bug最彻底的解决办法就是不要用SUN的JDK,而改用<a href="http://commerce.bea.com/products/weblogicjrockit/jrockit_prod_fam.jsp" target="_blank">BEA的 JRokit.</A><BR><BR>打不过,还逃不过吗? 有众多的选择,这就是开源的好。 :) </DIV></DIV>
页: [1]
查看完整版本: 分析java.lang.OutOfMemoryError: PermGen space