java.lang.OutOfMemoryError: PermGen space 异常
Posted on 2013-02-05 10:18 Bruce Zhang 阅读(635) 评论(0) 编辑 收藏 举报首先看看一些文章:
- http://www.freshblurbs.com/blog/2005/05/19/explaining-java-lang-outofmemoryerror-permgen-space.html
- http://stackoverflow.com/questions/1124131/what-can-be-done-with-permgen-out-of-space-exception-in-tomcat-spring-hibernat
相关案例:
(1)有些人是在SUN JDK+Tomcat 5.5.20运行服务的时,服务器跑几天后就会挂掉,并报java.lang.OutOfMemoryError: PermGen space异常。
(2)很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。
(3)于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!
解决方案:
设置环境变量:MAVEN_OPTS="-Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m"
我使用背景:单元测试时抛出“java.lang.OutOfMemoryError: PermGen space 异常”
我的实际解决经验:
(1)在Jenkins上配置好系统级环境变量:MAVEN_OPTS="-Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m" (保证标准情况正常)
(2)在Sonar上也配置上:MAVEN_OPTS="-Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m" (保证Sonar正常)
PS:开始没有为Sonar单独配置MAVEN_OPTS,在sonar跑单元测试时,内存异常一直存在。