某些时候,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