服务又双叒叕崩溃了!!!
自从采用了中台架构,每次上线都是提心吊胆的,生怕哪儿又冒出个问题,这不周二上完线,才过了一晚上,就发现内存激增,然后就爆了!!!
如图:
Rancher控制台功能还是很强大的,立马上去dump当前出问题服务的内存堆栈
为了找出内存激增的原因,运行一次GC,再dump一个堆栈,对比看是否存在内存泄漏
jcmd 1 GC.run
GC前后的内存堆栈都有了,用两次进行对比,分析:
可以看到char[]是占用内存最多的对象,String、Date对象也不少,,进去看看详情:我们排个序
发现有几个大字符数组,是日志打印的,居然有300多M大小!!!!!!正常日志打印是必要的,但是这个也太过分了爸爸,真的要给跪了,研发同学要打板子了。
按图索骥找到相关接口:
进去查看实现类,发现代码逻辑搞得特别复杂,没看出丁点面向对象的设计,而且使用了for循环查询数据库,都不用考虑性能的???如果数据量大了怎么搞?
查询参数也不做处理,至少判个空啊!!!完了,全量数据都查出来了,还for,这能不崩吗????
同学啊!写代码不是给喵星人当铲屎官,哐次哐次铲一堆就完了。要考虑功能、性能、安全性、可读性、隔离性,要层次分明,逻辑简单啊!你跨服务的时候在调用client接口啊,这本来就是给其他服务使用的,本服务内还调个什么哟,这么复杂的逻辑就是为了一个查询,写个join它不香嘛?商品SKU的缓存做没有?该冗余过来的数据做了冗余没?上点心哪!!!同学