遇java.lang.OutOfMemoryError: PermGen space之解决方案

          昨天项目更新功能但是报了一个永久保存区域溢出的错,导致我所有被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年提出到现在一直未能解决,也确实够让人失望的。

 

posted on   俱正Steven  阅读(5459)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示