垃圾回收不执行?请bang回答

10-03-29 ngq

使用cms垃圾回收方法,设置以下参数-XX:CMSInitiatingOccupancyFraction=50。理论上old堆里的内存使用超过50%就应该执行cms,可是我的机器上看,一致没有执行cms,知道最好快没有内存的时候才执行,导致程序down,什么问题以下是我的配置

-Xms3000m -Xmx3000m -Xmn500m -verbose:gc -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=50 -Xloggc:$HBASE_HOME/logs/gc-hbase.log

另外我们的项目使用hbase存储大容量数据,有研究的讨论以下。

xmuzyu
2010-03-29 20:25

你好,请问你是64位的机器吗?32位的,我以前设置超过2G内存JVM启动不起来。还有你说的系统down掉还有可能与你程序本身有关系,比如内存泄露等。还有老生代如果用CMS GC的话,新生代你用的什么GC?

你-xmx配置3000M,-xmn只有500M,这样不适合吞吐量优先考虑的场合,吞吐量优先的话要求新生代尽量大一点。

ngq
2010-03-30 09:30

谢谢楼上的回答,64位机器,程序本身没问题,新生代使用的是并行收集,新生代500M对我的系统足够用了,我分析了GC日志就是cms没有按设置执行,导致程序down掉,我设置的内存超过50%就进行cms但是我看日志cms并没有运行

xmuzyu
2010-03-30 20:30

兄弟,你好,你配置-XX:UseParNewGC(新生代) -XX:UseConcMarkSweepGC试试,你的参数里好像没有显示配置CMS吧。不过要注意用CMS GC的时候,不能配置-XX:UseParallelGC(用于较大新生代的收集)。

ps:用jstat -gcutil 进程id 打印时间间隔(毫秒)观察一下。

[该贴被xmuzyu于2010-03-30 20:31修改过]