[JAVA][新项目建设性能问题]业务操作OOM

43 阅读2分钟

背景:

  • 建设是仓促的, 人是到处借的, 需求是一直变的, 排期是倒排的, 加上厂商b公司性价比招人完全没有建设能力了, 老员工一点点跑, 外包一点点招, 项目经理也是飘在天上只会要时间的
  • 联调外部系统是临时的, 对接是赶鸭子上架的, 甲方是煞笔的,对端系统和这个甲方虽处一个集团,却是撒手不管的

问题:

某功能涉及调用外部系统接口获得数据以供校验逻辑

生产环境报错,堆栈信息指示出现在返回报文readLine处, OOM异常

解决:

  1. arthas排查强制执行代码, 模拟调用对端接口,回文卡住

  2. 回文输出到文件, 大小60MB?>>?>?>?>?>?>?>?>

  3. 定位为对端接口返回报文信息携带了过分多的冗杂信息,无法主动解决.原因如下

    • 接口是不能额外为我们提供的(前期是这么说的), 出事后就可以了, 但是要走审批流程上线流程等不起
    • 数据是不能同步的, 这个x路通x集团的信息化程度是灾难, 生动形象的体现了国企病 , 讨论对接数据方案黄花菜都凉了
  4. 回到OOM本身, 内存是够的, 堆文件dump是没触发的, 阅读堆栈信息对应的源码, 实际为报文长度唱过char[]长度上限(int型),抛出的OOM异常,并非真的内存溢出

  5. 修正代码逻辑.改为流式读取,流式解析json,仅读取我方需要的字段

规范:

  1. 外部接口对接需充分考虑报文极端情况
  2. 代码评审: 使用文本操作或json编译等情况, 请充分评估大数据场景