前段时间拿到一个SSH项目,用Tomcat6(Myeclipse集成)启动一会儿就会抛出内存溢出错误,开发工作几乎无法进行,不停的启动内存溢出。在网上搜索多种方法仍然无效,无赖只能继续开发了几天,实在不甘心,这样总不是个办法吧。
现在总结一下:
网上常见的解决Tomcat内存溢出的方法:
1.修改tomcat启动文件,设置tomcat内存大小。
2.MyEclipse集成tomcat中配置tomcat大小。
我试图各种方法把内存设置到相对大的值,但是仍然会报内存溢出错误,通过内存监控发现java进程一度占用内存600多兆,到达这个值后不久就会抛出内存溢出错误。
通过内存分析可以发现我设置的tomcat内存最大值远远大于600多兆,说明问题不出在tomcat内存设置上。
那么详细分析一下,由于项目使用SSH框架,且项目文件达到300多兆,是一个庞大的项目,项目启动时会load大量的class,hibernate会缓存大量的数据。
COPY:
说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不 同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
根本原因还是出在class加载上,我们知道Class加载是由Java虚拟机来完成的,所以设置虚拟机的内存大小才是关键,在MyEclipse中设置:从Intalled JREs里修改;window->Preferences->Java->Installed JREs,选择当前的JRE,然后edit它;在新窗口里设置Default VM Arguments为 -Xms128M -Xmx512M适当调整合适的内存大小即可。