IDEA解决运行项目虚拟内存溢出问题

在我们运行一个比较大的项目的时候总是出现Caused by: java.lang.OutOfMemoryError: PermGen space的问题简单在网上查询了一下意思是内存溢出了,什么?我的电脑是8G运行内存,256的固态,你告诉这样都能内存溢出?大哥不要激动,不是说你的电脑内存溢出,请听我慢慢的解释:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
    以下是网上的各种说法:
  (1)这是由于Tomcat不太稳定的hot publisher/hot
deployer导致的内存泄露,建议关闭Eclipse中服务器配置autopublishing功能,然后手动重新启动Tomcat,或者去掉tomcat的webapps文件中已经不需要的那些项目。
  (2)发现很多人把问题归因于: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加了句评语:“Abug this critical is open since 2003? Absolutely shameful.”
   (3)It's usually happened when the Tomcat start and stop few times. It’s just funny, however you can fine tune it with some minor changes
in the Tomcat configuration setting. By default, Tomcat assigned very little memory for the running process, you should increase thememory by make change in catalina.sh or catalina.bat file.
   
解决方法: 手动设置MaxPermSize大小
   设置参数 -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
Tomcat中,修改TOMCAT_HOME/bin/catalina.sh(linux系统下start.sh会调用它来启动tomcat,windows下调用catalina.bat,修改类似)

在文件头部注释后加入
JAVA_OPTS='-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m'
如果tomcat运行多个系统,将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

好了以上都是从网上复制的,也有说的比较好的地方,现在说说自己对这个问题的理解吧,简单来说就是服务器(tomcat或者是其他应该都是一样的)预先设置一个专门的空间来加载class类,由于设计人员刚开始的各种考虑吧这个空间分配的内存是固定的(可能比较小),而现在随着科技的发展,项目变得越来越大或者需要同时启动两个或者更多的项目的时候这个空间就不够用了,就会出现内存溢出的情况,所以可以肯定一定不是我们电脑的内存溢出,我喜欢把这个内存叫做服务器给项目分配的初始化虚拟内存,那既然知道了是这个空间问题,那么解决这个问题很显然就是重新设置这个空间的内存配置参数了,IDEA配置tomcat的页面中就可以设置如下图:


当然设置的参数根据你的项目状况和电脑的配置来决定咯,楼主路口因为要同时启动两个项目所以配置的比较大是:-Xmx1024m -enableassertions -server -XX:MaxPermSize=1024m

猜你喜欢

转载自blog.csdn.net/hy_coming/article/details/80900418
今日推荐