java.lang.OutOfMemoryError: PermGen space及其解决方法

时间:2021-10-21 09:35:11

mueclipse 在启动tomcat后,在系统中还没点几下就报  java.lang.OutOfMemoryError: PermGen space 偶尔的话还可以接受但是经常出现这个问题,尤其是启动时间比较长的工程是很影响开发效率的。在网上找了好久终于在别的博客里的回复里找到了答案,以下是原文:


http://blog.csdn.net/fengyie007/article/details/1780375


解决OutOfMemoryError: PermGen space,过程是痛苦的,结果是舒畅的

最近自己的程序在Redeploy重新部署的时候,老提示OutOfMemoryError: PermGen space错误,在网络上搜索了相关的资料,但是按照做后还是存在这个问题。由于我是第一次碰到这个问题,花费了我2天时间,过程比较痛苦,结果还是比较圆满的。我将我的经历写下来,供我自己以后参考,也提供给大家分享。

在网络上关于OutOfMemoryError: PermGen space的解决办法很多了,但是有的办法都是互相转发,真假难辨。有的可能还产生误导。

我的环境是Myeclips 8.5、tomcat6.x,试过了很多办法后,比如:文档《Linux 和 Windows修改Java虚拟机内存大小》(http://duanfei.iteye.com/blog/1189541),中的办法,我都试过了,还是不行;当然还参考了很多其他资料,然后进一步研究JVM的优化等,我就是想知道我配置的内存参数应该够大了,为什么还是溢出,难道没有生效,那我就需要找到配置后系统认可的内存参数是多少,参考网络上的知识,启动了JDK自带的工具,在\jdk1.6.0_10\bin下面的jconsole.exe内存监控的工具,点击进入如下:选择PID为4472的这个进程,选择内存页,并且选择图表中最后一个选项的“内存池“Perm Gen”,下面的详细信息显示的是:
这个地方的最大值是65536Kb,也就是64M,我于是就找到原因了,64M肯定会导致溢出,但是我配置了几百兆的内存空间就是不生效呢。注意,这个是我在myclipse中启动的tomcat看到的结果。


接下来,我进入bin/catalina.bat文件中的“rem ----- Execute The Requested Command -”这个后面增加了下面的语句set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=512m,这个地方注意增加的位置是在rem ----- Execute The Requested Command –后面,最好set JAVA_OPTS=%JAVA_OPTS% 这个也要加上,这个网络上好多文档没有将这个位置交代清楚,或者说的不是这个地方,是不是其他地方也可以,我没有试。我手工启动tomcat,在cmd状态下输入:startup,然后看jconsole.exe,明细Perm Gen的内存就是我配置的内存521M,是生效了的.
但是我在myclipse中启动tomcat后,重新部署程序,错误依旧。原来文档《Linux 和 Windows修改Java虚拟机内存大小》(http://duanfei.iteye.com/blog/1189541)中提到
如果是通过Myeclipse启动Tomcat修改
Myeclipse配置选项 打开选项..输入tomcat关键字,然后点开Server下面的JDK就会出现配置区域Optional Java VM arguments.


直接加入 -Xms128m -Xmx512m 
这个地方是有一个漏洞的,直接加入 “-Xms128m -Xmx512m ”,应该是“ -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m”,这个是对myclipse生效的。如果没有-XX:PermSize=256m -XX:MaxPermSize=512m,那么PermGen的内存始终是64M。修改后,重启tomcat,重新部署,内存不再溢出了。
我的机器上是:Servers/Tomcat/Tomcat 6.x/JDK 中的Optional Java VM arguments:
找到了原因,解决也就自然很简单了。
注意这个地方Servers/Tomcat/Tomcat 6.x 这个地方还有一个参数:Optional program arguments,这个感觉作用不大,我也是修改后没有什么效果,我以为修改这个地方就可以了,导致我走了弯路。