0
点赞
收藏
分享

微信扫一扫

4核8g机器的jvm通用参数模板

是波波呀 2022-04-29 阅读 81
java后端

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的机器的,如果机器不满足这个要求,或者该机器上部署了多个项目,就需要另行设置了.

举报

相关推荐

0 条评论