背景:
- 建设是仓促的, 人是到处借的, 需求是一直变的, 排期是倒排的, 加上厂商b公司性价比招人完全没有建设能力了, 老员工一点点跑, 外包一点点招, 项目经理也是飘在天上只会要时间的
- 联调外部系统是临时的, 对接是赶鸭子上架的, 甲方是煞笔的,对端系统和这个甲方虽处一个集团,却是撒手不管的
问题:
某功能涉及调用外部系统接口获得数据以供校验逻辑
生产环境报错,堆栈信息指示出现在返回报文readLine处, OOM异常
解决:
-
arthas排查强制执行代码, 模拟调用对端接口,回文卡住
-
回文输出到文件, 大小60MB?>>?>?>?>?>?>?>?>
-
定位为对端接口返回报文信息携带了过分多的冗杂信息,无法主动解决.原因如下
- 接口是不能额外为我们提供的(前期是这么说的), 出事后就可以了, 但是要走审批流程上线流程等不起
- 数据是不能同步的, 这个x路通x集团的信息化程度是灾难, 生动形象的体现了国企病 , 讨论对接数据方案黄花菜都凉了
-
回到OOM本身, 内存是够的, 堆文件dump是没触发的, 阅读堆栈信息对应的源码, 实际为报文长度唱过char[]长度上限(int型),抛出的OOM异常,并非真的内存溢出
-
修正代码逻辑.改为流式读取,流式解析json,仅读取我方需要的字段
规范:
- 外部接口对接需充分考虑报文极端情况
- 代码评审: 使用文本操作或json编译等情况, 请充分评估大数据场景