每日用户点击量上亿次,用户平均点击20-30次,日活用户500万,最终付费下单用户10%,日均50万单,如果不做促销活动,这50万单大概在3到4个小时内完成,每秒平均35单左右,这个可以接受。
但在促销场景下,如果每秒1000单,用3台服务器做负载均衡,每台服务器每秒300单,每台服务器上每秒产生的对象(1KB的订单对象以及关联的对象及查询业务的对象)大概为60M。假设JVM的参数设置为堆大小为3G,年轻代占3分之一为1G,其中eden区占800M,S0和S1占100M。这种情况下,大概14秒左右eden区被占满,会触发minaGC,假设有1秒钟的对象未被归为垃圾对象(minaJC触发jwc,那1秒钟的用户线程被暂停,有60M对象产生但未被标记为垃圾对象)大小为60M,根据对象动态年龄判断[当前放对象的Survivor,一批对象的总大小大于这块Survivor内存的50%,那么大于这批对象年龄的对象,就可以直接进入老年代了],此时s0,s1大小为100M,其一半小鱼60M,因此这批对象会直接进入老年代。而老年代大小为2G,大概三四分钟会触发FullGC。这进入老年代的这批对象,在FullGC时会被回收到。——问题就是三四分钟的FullGC很频繁,二期进入老年代的对象属于朝生夕死。因此需要调优。
调优策略:把年轻代大小设为2G,eden区为1.6G,s0,s1设为200M。