4核8g的机器针对于这个系统的jvm参数如下:
-Xms4096M?
-Xmx4096M?
-Xmn3072M?
-Xss1M ?
-XX:PermSize=256M?
-XX:MaxPermSize=256M?
-XX:+UseParNewGC?
-XX:+UseConcMarkSweepGC?
-XX:CMSInitiatingOccupancyFaction=92?
-XX:+UseCMSCompactAtFullCollection?
-XX:CMSFullGCsBeforeCompaction=0
1.为什么设置4g的堆内存大小
8g的机器一般分配一半的最大内存就可以了,因为机器本上还要占用一定内存
2.为什么设置3g的新生代内存空间
为了让对象尽可能的在新生代的eden区和survivor区按照默认8:1:1的比例来分配时尽可能的让survivor区内存多一点,达到300兆左右,这样可以防止每次垃圾回收过后对象几十兆,这几十兆可能是部分请求未处理完毕,是一定会发生的.所以这些对象肯定会触发动态年龄判定规则,让部分对象进入老年代.
3.CMSFullGCsBeforeCompaction设置为0,然后CMSInitiatingOccupancyFaction设置为92为什么
首先CMSInitiatingOccupancyFaction设置为92,证明在当老年代的内存使用率到达92%,之后就需要进行fullgc了
但是一般设置该值都比较低才对,因为存在内存碎片的问题.可能还没使用那么多内存,剩余内存就因为内存碎片而放不下了,就会进行fullgc.所以一般设置低一点.保证fullgc之后可以有剩余内存可以放入对象.
但是为什么这里设置为92呢.因为CMSFullGCsBeforeCompaction设置为0了,意思是每次在fullGC之后就对内存碎片进行回收,正因为如此,CMSInitiatingOccupancyFaction才能设置那么高.可以更高效的利用老年代的内存.
4. CMSParallelInitialMarkEnabled这个参数是做什么的
该参数可以让fullgc的频率进一步降低.意思是cms垃圾回收器的初始标记阶段开启多线程并发执行.
因为在初始标记阶段是会进行stop the world的,导致系统卡顿,所以开启多线程并发执行可以减少stw的时间.这里比较纳闷.应该默认就给开启的.竟然要手动开启
5. CMSScavengeBeforeRemark
这个参数是指在cms的重新标记之前,先尽量执行一次younggc,因为cms重新标记也是会stw的,如果在重新标记之前,先执行younggc的话,就可以让cms在重新标记时少扫描一些对象.同样可以提升cms的重新标记的性能.较少耗时.
总结:
上述参数设置过之后基本上fullgc都在几天一次了,基于上面参数可以作为一个通用的模板.对于一些普通的业务系统,保证jvm性能不会有太大问题.但是上面的参数时针对4核8g的机器的,如果机器不满足这个要求,或者该机器上部署了多个项目,就需要另行设置了.