博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

java.lang.OutOfMemoryError: PermGen space 异常

Posted on 2013-02-05 10:18  Bruce Zhang  阅读(635)  评论(0编辑  收藏  举报

首先看看一些文章:

  1. http://www.freshblurbs.com/blog/2005/05/19/explaining-java-lang-outofmemoryerror-permgen-space.html
  2. 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跑单元测试时,内存异常一直存在。