场景

电商促销的逻辑,由于算价过程涉及的逻辑较多,所以有关算价的过程及结果数据都会打印下来,一旦有问题较容易排查
满减赠折是促销模块比较复杂的逻辑,这次出现问题的原因是因为建了一个满减赠折的活动,满1元送一个赠品以及100个积分,几十万元送几十w个赠品,导致在打印日志的时候出现了问题

问题分析

好在运维人员配置了自动dumpMemory

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/applicationNameHeapdump.hprof
在JVM内存溢出的时候自动dump内存快照,HeapDumpPath指定dump的路径,不指定的话默认输出路径为项目的根路径
经本地main方法测验,只要dump过一次,之后多次出现的oom不会dump第二次(删除dump的文件也不行)

用jProfiler分析之后发现果然是日志打印过多,就是因为送赠品送了几十w个,会产生几十w个对象,显然这是不正确的,实际应该用数值表示有多少个即可。所以几十w个对象再用日志输出的时候显然就成为了一个系统瓶颈
毕竟在写完磁盘之前,这些对象一直贮存在内存中,导致内存偏小,机器的tps明显下降、甚至多次出现oom

解决方案

可参考优雅打印日志
或者修改代码逻辑,用数值代表几十万的赠品,不应该用几十万个对象