亿级流量电商网站订单系统分析
亿级流量电商(每日用户点击上亿次),每个用户浏览购买大概点击二三十次,日活跃500万用户,假定付费转化率10%,日均50万订单,促销活动订单集中在抢购前几分钟产生每秒1000多单,三个订单系统,每个订单系统每秒300多单,每个对象假定1KB,每秒300K订单对象生成,下单还涉及其他优惠券积分等对象,放大20倍,300KB20每秒,可能同时还有其他操作订单查询等,再放大10倍,300KB20*10每秒60M的对象1秒后都变为垃圾对象。
如果按照JVM默认参数,堆内存分配3G,老年代2/3 2G,新生代1/3 1G,
新生代的eden区域8/10 800M,survivor区域1/10 100M,这样每秒产生60M垃圾对象,13秒占满eden区,触发minor gc,触发的瞬间,新产生的对象还不能回收,会直接被放到form区域,新产生的对象60M,超过form区域的百分之50,会直接被放入老年代,每13秒就会有60M对象放入老年代。几分钟后就触发 full gc,full gc是我们不想看到的,所以要重新设置JVM参数,调整堆内存大小。
调优
分析发现订单系统都是新生代对象产生就变成垃圾,这样把老年代设置为1G,新生代设置2G,变为eden区1.6G,survivor区200M,还是每秒60M订单垃圾对象,大概26秒触发minor gc,触发瞬间也是有60M的垃圾对象放入form区,不超过form区大小的50%,不放入老年代,这样下次触发minor gc的时候会被垃圾回收,所以full gc 几乎不会发生。