系统如何优化JVM参数设置(ParNew+CMS)
payattentionto拿⽹上最长说的电商举例吧,因为电商技术覆盖⾯⼴,流量⼤。
衣橱的英文>船期英语⼤型电商系统后端现在⼀般都是拆分为多个⼦系统部署的,⽐如,商品系统,库存系统,订单系统,促销系统,会员系统等等。我们这⾥以⽐较核⼼的订单系统为例
( 各家订单系统不⼀样,我的公司当初在做订单的时候,是存储了商品快照的,除订单对象外,⽣成的其他对象⽐较⼤。)
对于8G内存,我们⼀般是分配4G内存给JVM,正常的JVM参数配置如下:
‐Xms3072M ‐Xmx3072M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8
cyborg这样设置可能会由于动态对象年龄判断原则导致频繁full gc。
可以更新JVM参数设置:
bbq什么意思
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8
教育部托福报名官网
terrors这样就降低了因为对象动态年龄判断原则导致的对象频繁进⼊⽼年代的问题,其实很多优化⽆⾮就是让短期存活的对象尽量都留在survivor⾥,不要进⼊⽼年代,这样在minor gc的时候这些对象都会被回收,不会进到⽼年代从⽽导致full gc。
对于对象年龄应该为多少才移动到⽼年代⽐较合适,本例中⼀次minor gc要间隔⼆三⼗秒,⼤多数对象⼀般在⼏秒内就会变为垃圾,完全可以将默认的15岁改⼩⼀点,⽐如改为5,那么意味着对象要经过5次minor gc才会进⼊⽼年代,整个时间也有⼀两分钟了,如果对象这么长时间都没被回收,完全可以认为这些对象是会存活的⽐较长的对象,可以移动到⽼年代,⽽不是继续⼀直占⽤survivor区空间。
对于多⼤的对象直接进⼊⽼年代(参数-XX:PretenureSizeThreshold),这个⼀般可以结合你⾃⼰系统看下有没有什么⼤对象⽣成,预估下⼤对象的⼤⼩,⼀般来说设置为1M就差不多了,很少有超过1M的⼤对象,这些对象⼀般就是你系统初始化分配的缓存对象,⽐如⼤的缓存List,Map之类的对象。
可以适当调整JVM参数如下:
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8
‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M
培训招生网站come what may对于JDK8默认的垃圾回收器是-XX:+UParallelGC(年轻代)和-XX:+UParallelOldGC(⽼年代),如果内存较⼤(超过4个G,只是经验值),系统对停顿时间⽐较敏感,我们可以使⽤ParNew+CMS(-XX:+UParNewGC -XX:+UConcMarkSweepGC)
对于⽼年代CMS的参数如何设置我们可以思考下,⾸先我们想下当前这个系统有哪些对象可能会长期存活躲过5次以上minor gc最终进⼊⽼年代。小学生英语口语
⽆⾮就是那些Spring容器⾥的Bean,线程池对象,⼀些初始化缓存数据对象等,这些加起来充其量也就⼏⼗MB。
还有就是某次minor gc完了之后还有超过⼀两百M的对象存活,那么就会直接进⼊⽼年代,⽐如突然某⼀秒瞬间要处理 五六百单,那么每秒⽣成的对象可能有⼀百多M,再加上整个系统可能压⼒剧增,⼀个订单要好⼏秒才能处理完,下⼀秒可能⼜有很多订单过来。
我们可以估算下⼤概每隔五六分钟出现⼀次这样的情况,那么⼤概半⼩时到⼀⼩时之间就可能因为⽼年代满了触发⼀次Full GC,Full GC的触发条件还有我们之前说过的⽼年代空间分配担保机制,历次的minor gc挪动到⽼年代的对象⼤⼩肯定是⾮常⼩的,所以⼏乎不会在minor gc触发之前由于⽼年代空间分配担保失败⽽产⽣full gc,其实在半⼩时后发⽣full gc,这时候已经过了抢购的最⾼峰期,后续可能⼏⼩时才做⼀次FullGC。
对于碎⽚整理,因为都是1⼩时或⼏⼩时才做⼀次FullGC,是可以每做完⼀次就开始碎⽚整理,或者两到三次之后再做⼀次也⾏。
综上,只要年轻代参数设置合理,⽼年代CMS的参数设置基本都可以⽤默认值,如下所⽰:
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8
‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M ‐XX:+UParNewGC ‐XX:+UConcMarkSweepGC
‐XX:CMSInitiatingOccupancyFraction=92 ‐XX:+UCMSCompactAtFullCollection ‐XX:CMSFullGCsBeforeCompaction=0