1).如下图,一个亿级流量的电商系统,在大促销的情况下的订单并发情况:
2).如果按传统根据系统内存的大小进行JVM内存分配的情况:
如果仅是根据系统的内存大小来进行JVM内存分配会产生大量的full gc
如图:场景是每秒产生60M对象,在一秒后出栈成为垃圾对象。
1.运行14秒eden满了,触发年轻代的minoc gc,存活的对象被复制到S0,不存活的对象被回收, 并且存活的对象年龄都增大一岁
2.被复制到s0的这批对象在转移到s0的时候会触发对象动态年龄机制判断,超过s0的百分之50的这批对象会直接进入老年代从而很快就触发了fullgc
3)优化方案
在峰值在每秒60M之内的压力场景下,可以这样进行优化:
将年轻代改为2个G,按8:1:1比例,eden是1.6G,s0是200M,
1.运行25秒eden满了,触发年轻代的minoc gc,存活的对象被复制到S0,不存活的对象被回收, 并且存活的对象年龄都增大一岁
2.被复制到s0的这批对象会成功保存到s0并增加这批对象的年龄
3.当eden再一次触发minoc gc的时候
在转移s0的时候不会再直接就进入老年代了,而是在s0和s1之间随着minoc gc进行判断回收销毁了。