一.3.19大促时的压测:
1.问题:营销接口采用fastjson的方法序列化和反序列化去实现对象间属性的拷贝,因为营销接口里面有大量的循环,造成序列化和反序列化一秒80万的操作,占用大量cpu资源,造成热线程。
解决:去除序列化和反序列化操作,用get set替代。这样不会出现占用大量cpu资源的情况。
2.问题:商品接口用spring的PropertyUtils去操作对象间属性的拷贝。性能太低。
解决:换成Cglib的 BeanCopier,效率提升的10倍。
延伸:
进行了三次测试,最后的结果如下:
10次测验 | 第一次 | 第二次 | 第三次 | 平均值 | 每次平均值 |
---|---|---|---|---|---|
BeanUtil.copyProperties | 54 | 57 | 50 | 53.66667 | 5.366666667 |
PropertyUtils.copyProperties | 4 | 4 | 4 | 4 | 0.4 |
org.springframework.beans.BeanUtils.copyProperties | 12 | 10 | 11 | 11 | 1.1 |
BeanCopier.create | 0 | 0 | 0 | 0 | 0 |
10000次测验 | 第一次 | 第二次 | 第三次 | 平均值 | 每次平均值 |
---|---|---|---|---|---|
BeanUtil.copyProperties | 241 | 222 | 226 | 229.6667 | 0.022966667 |
PropertyUtils.copyProperties | 92 | 90 | 92 | 91.33333 0.009133333 | |
org.springframework.beans.BeanUtils.copyProperties | 29 | 30 | 32 30.33333 | 0.003033333 | |
BeanCopier.create | 1 | 1 | 1 | 1 | 0.1 |
10000次反转测验 | 第一次 | 第二次 | 第三次 | 平均值 | 每次平均值 |
---|---|---|---|---|---|
BeanUtil.copyProperties | 178 | 174 | 178 | 176.6667 | 0.017666667 |
PropertyUtils.copyProperties | 91 | 87 | 89 | 89 | 0.0089 |
org.springframework.beans.BeanUtils.copyProperties | 21 | 21 | 21 | 21 | 0.0021 |
BeanCopier.create | 0 | 1 | 1 | 0.666667 | 6.66667E-05 |
- Cglib的 BeanCopier最高
3.问题:代码下压测情况下抛出ConcurrentModificationException,经过排查是营销接口的ArrayList.sort()出现并发冲突。
方案:去除ArrayList.sort()用别的方法排序。
ArrayList.sort()这个操作虽然没有set,remove等操作,但是改变了数据的顺序,有指针等操作,也会造成ConcurrentModificationException
网友评论