昨天项目更新功能但是报了一个永久保存区域溢出的错,导致我所有被SSH调用的方法都不可用,让我很是郁闷了一番,不过这个问题很普遍。
网上一搜,解决方案一大堆。之所以报这个错,原因:PermGen space(内存的永久保存区域)这一部分用于存放Class和Meta的信息,Class
在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC不会在主程序运行期对PermGen space进行清理,所以如
果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
的时候。
我的项目使用了spring,他会大量产生代理对象,虽然产生到一定程度就不会增加了,但是因为延迟加载,所以项目大了之后,代理对象就很容易超过
默认的4M空间,而导致接下来所有注入方法都不能够执行。
解决方案,大体上两种,一种是加大PermSize,我用的安装版tomcat,所以就使用管理工具加了几个参数。从此世界平静了。
-XX:PermSize=256M
-XX:MaxPermSize=256M
-XX:ReservedCodeCacheSize=48M
第二种就是使用oracle的BEA JDK,因为这个里面的JVM没有PermGen space这样的区域,所以也就不存在这样溢出的问题。但是因为jrockit比较消耗
资源,所以我只推荐在生产环境中使用,开发环境还是sun的比较省。
从这个角度来说sun jvm这个不能动态增加PermGen space大小,从03年提出到现在一直未能解决,也确实够让人失望的。