posts - 42,comments - 83,trackbacks - 0

        某些时候,Application Server运行一段时间后,会出现PermGen OOM的现象。所谓PermGen,它是Sun/HP JDK中独有的,用于保存class原数据信息的地方,class被load后,数据信息会被放入perm中,而不是OldGen或YoungGen。一般情况下,fullGC会触发perm的GC,即辅助清理那些没必要的类,以便降低perm的开销,而由于jdk的自身原因,fullGC不触发permGC的情况也是存在的,如何保证perm中的无用类信息会被清除呢,可以试试下面的几个参数(红色标注),

-Xms384M -Xmx384M -XX:NewSize=64M -XX:MaxNewSize=64M -XX:PermSize=64m -XX:MaxPermSize=64m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled  -XX:+CMSPermGenSweepingEnabled -XX:+CMSPermGenPrecleaningEnabled -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+TraceClassLoading -XX:+TraceClassUnloading

        对于PermGen的开销,我们通常需要定位这些开销是泄漏还是应用自身需要。对于泄漏(比如动态生成的类太多,用完之后不再使用,我们需要优化应用、框架,看看是否可以避免这些问题),如果应用自身对于perm的需求就比较大(比如应用包很大,类很多),那么上面的参数一般是无法帮助我们降低perm开销,这时候,我们能做的就是逐渐加大perm size, 直到一个能让系统稳定的值。

posted on 2009-04-14 10:46 走走停停又三年 阅读(1349) 评论(1)  编辑  收藏 所属分类: Java Technology

FeedBack:
# re: PermGen OOM的问题[未登录]
2009-04-14 15:56 | john
有时候在运行时调用字节码生成器也可能会引发此类异常,比如cglib  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: